Serach

2013년 10월 10일 목요일

MS-SQL Store Procedure

Store Procedure를 이용하면 여러행에 걸친 많은 Query들을 한데 모아 일괄적으로 실행시킬 수 있습니다. 또한 특정 Table에 접근 권한이 없는 사용자라 할지라도 Procedure를 이용하면 조회가 가능하게 할 수 있으므로 보안성면에서도 충분한 활용가치가 있고 뿐만 아니라 많은 Query를 Client측에서 직접 전송하기 보다는 Query를 Procedure에 저장하고 해당 Procedure를 호출하는 Query만 전송한다면 Network Traffic감소에도 상당한 도움을 줄 수 있습니다.

Store Procedure에도 여러 종류가 있으나 지금은 가장 일반적으로 사용되는 사용자 Store Procedure에 대해 알아보도록 하겠습니다.

1. Procedure 생성및 변경, 삭제

사용자 Sotre Procedure는 다음과 같은 방법을 통해 생성할 수 있습니다.

Create procedure (이름)
 @(매개변수) (형식)
As
(query)

<이름>은 생성하고자 하는 procedure명에 해당하며 @<매개변수>는 Procedure에서 Data를 처리할때 필요한 인수를 전달해 주도록 하는 변수입니다.(<형식>은 해당 매개변수의 Data type을 의미합니다.) 그리고 As하위에 실제 작동할 Query가 작성됩니다.

다음은 실제 Procedure를 구현한 예제 입니다.

Create procedure Employee
 @BusID Int
As
Select BusinessEntityID, NationalIDNumber, LoginID
From HumanResources.Employee
Where BusinessEntityID = @BusID;

Employee라는 이름으로 Procedure를 작성합니다. 해당 Procedure는 HumanResources.Employee Table을 조회하여 BusinessEntityID, NationalIDNumber, LoginID 열값을 반환하도록 하였습니다. 이때 사용자가 설정한 @BusID변수에 따라 다른 BusinessEntityID에 해당하는 내용을 보여주게 되는 것입니다.

작성한 Procedure는 다음과 같은 방법으로 호출합니다.

Exec Employee @BusID = 2;

Employee Procedure를 호출하여 HumanResources.Employee Table에서 BusinessEntityID값이 2인 것만을 가져오도록 하였습니다.


생성된 저장 procedure를 수정하려면 Alter를 이용합니다.


Alter procedure Employee
 @BusID Int   = 1,
 @ID  Char(20) = ''
As
Select BusinessEntityID, NationalIDNumber, LoginID, JobTitle
From HumanResources.Employee
Where BusinessEntityID = @BusID
And LoginID = @ID;

Alter를 통해 Sotre Procedure를 변경하였습니다. 이번에는 @ID변수를 추가하였으며 실제 조회하는 Query에서도 @ID조건을 적용하였습니다. 또한 Procedure내에서 @BusID Int를  = 1이라고 해준것은 사용자가 이 매개변수에 아무런 값도 지정하지 않았을 경우를 대비한 것입니다. 값이 지정되지 않으면 기본적으로 1값을 사용하게 됩니다.

Procedure가 제대로 변경되었는지 확인해 보겠습니다.

Exec Employee @ID = 'adventure-works\ken0';

@BusID에 아무런 값도 지정하지 않고 기본값을 사용하도록 하였습니다.


위 에서 Procedure변경시에 사용자가 직접 값을 전달해 줄 수 있는 매개변수를 지정하였습니다. 이와는 다르게 Procedure가 실행 후 해당 Procedure로 부터 특정값을 가져오게 하는 매개변수를 설정할 수도 있습니다.

Alter procedure Employee
 @BusID  Int   = 1,
 @ID   Char(20) = '',
 @DateTime DateTime Output
As
Select BusinessEntityID, NationalIDNumber, LoginID, JobTitle
From HumanResources.Employee
Where BusinessEntityID = @BusID
And LoginID = @ID;
Select @DateTime = getdate();

Employee Procedure를 @Date라는 반환매개변수를 가지도록 수정합니다. @Date는 두번째 Select문을 통해 Database의 현재 시간이 들어갈 것입니다.

변경된 Procedure를 호출하여 출력되는 값을 확인해 보도록 하겠습니다.

Declare @NowTime Datetime;
Exec Employee 1, 'adventure-works\ken0', @NowTime Output
Select @NowTime;

값을 받을 변수를 선언한뒤 Procedure호출 부분에서 '<변수> output'을 통해 값을 받을 수 있도록 하였습니다. 또한 Procedure호출시 매개변수가 정의된 순서대로 값이 지정되는 경우라면 매개변수명의 생략도 가능함을 보여주고 있습니다.


Procedure실행에서 값을 받는 경우라면 Return문도 사용할 수 있습니다.
단, Return문은 Procedure의 Query가 종료되는 시점에만 사용할 수 있으며(Query실행중 Return문을 만나면 실행이 종료됩니다.) 반환값은 정수값만 가질 수 있다는 특징이 있습니다. 대부분의 경우 Return문은 Query가 정상적으로 종료되었는지 비정상적으로 종료되었는지 확인하기 위한 flag로 많이 쓰입니다.

위에서 생성한 Employee Procedure를 Return문을 통해 값을 반환하도록 수정해 보겠습니다.

Alter procedure Employee
 @BusID  Int   = 1,
 @ID   Char(20) = ''
As
Select BusinessEntityID, NationalIDNumber, LoginID, JobTitle
From HumanResources.Employee
Where BusinessEntityID = @BusID
And LoginID = @ID;
Return 1;

Query실행 마지막에 Return문을 두어 1값을 반환하도록 하였습니다.

변경된 내용을 확인하기 위해 Procedure를 호출해 보겠습니다.

Declare @RtnValue Int;
Exec @RtnValue = Employee 1, 'adventure-works\ken0';
Select @RtnValue;

Return문에 의한 값을 받을 수 있도록 변수를 선언한 뒤 = 문자를 통해 값을 받을 수 있도록 하였습니다.


Procudre가 더이상 필요없는 경우에 Drop문을 이용하시면 원하는 Procedure를 삭제하실 수 있습니다.

Drop Procedure Employee;

2. Store Procedure 암호화

만일 Store Procedure의 내용을 다른 사람에게 노출하지 않으시려면 다음처럼 암호화 하시면 됩니다.

Create procedure Employee
 @BusID Int   = 1,
 @ID  Char(20) = ''
 With Encryption
As
Select BusinessEntityID, NationalIDNumber, LoginID, JobTitle
From HumanResources.Employee
Where BusinessEntityID = @BusID
And LoginID = @ID;

Procedure 생성부분에 Encryption option을 지정하여 암호화 하도록 합니다.

주의:
Procedure는 한번 암호화 하면 암호를 풀어서 볼 수 있는 방법이 없습니다. 따라서 Procedure를 암호화 하기전 내용을 따로 저장해 두어야 합니다.

3. Procedure의 자동실행

Procedure는 원한다면 SQL Server가 실행될때 sp_procoption을 통하여 자동적으로 실행 될 수 있도록 할 수 있습니다. 단, 이때 자동실행되는 Procedure는 Master Database에 저장되어야 하며 매개변수는 쓸 수 없습니다.

Procdure의 자동실행은 다음과 같은 방법으로 등록할 수 있습니다.

sp_procoption @procname = 'procedure 이름', @optionname = 'startup', @optionvalue = 'on 또는 off'

@procname은 자동실행할 Procedure의 이름이며 @optionvalue는 on/off로 자동실행 여부를 나타내도록 합니다.(@optionname은 statrup만 설정가능합니다.)

그런데 만일 위와 같이 설정해도 해당 Procedure가 자동으로 시작되지 않는다면 SQL Server를 다음과 같이 설정변경해야 합니다. 

Execute sp_configure 'show advenced option', '1'
Reconfigure With Override;
Execute sp_configure 'scan for startup procs', '1'
Reconfigure With override;

4. System Store Procedure

System Store Procedure는 사용자의 편의를 위해 SQL Server자체에 이미 준비되어 있는 Procedure입니다. 이 중에서 자주쓰이는 몇가지만 살펴보도록 하겠습니다.

(1) sp_configure

Server설정에 관한 Procedure입니다.

(2) sp_help <이름>

이름에 지정된 Table이나 Procedure의 정보를 보여줍니다.

(3) sp_helpdb <db 명>

Database에 관한 정보를 얻고자 할때 쓰입니다.

(4) sp_helptext <이름>

Procedure 혹은 View의 Code를 보여 줍니다.

(5) sp_who(who2)

현재 SQL Server에 연결중인 사용자 목록을 표시합니다.

댓글 없음:

댓글 쓰기