SQL 총 결 저장 프로시저

콘 셉 트
저장 프로 세 스 (Stored Procedure): 실행 가능 한 프로 세 스 의 하나 이상 의 SQL 문장 으로 사전 컴 파일 되 었 습 니 다.
저장 프로시저 생 성 문법

CREATE proc | procedure procedure_name
[{@ } [= ] [output],
{@ } [= ] [output],
....
]
as
SQL_statements
go


저장 프로 세 스 와 SQL 문장 비교
우세:
1. 성능 향상
SQL 문 구 는 생 성 과정 에서 분석 하고 컴 파일 합 니 다.저장 과정 은 사전 컴 파일 된 것 으로 저장 과정 을 처음 실행 할 때 최적화 기 를 조회 하여 이 를 분석 하고 최적화 시 키 며 최종 적 으로 시스템 표 에 존재 하 는 저장 계획 을 제시 하면 실행 과정 에서 이 비용 을 절약 할 수 있다.
2. 인터넷 비용 절감
저장 프로 세 스 호출 시 저장 프로 세 스 이름과 필요 한 매개 변수 정 보 를 제공 하면 네트워크 의 트 래 픽 을 낮 출 수 있다.
3. 코드 이식 에 편리 함
데이터베이스 전문가 들 은 수시로 저장 과정 을 수정 할 수 있 지만 응용 프로그램의 소스 코드 에 영향 을 주지 않 아 프로그램의 이식 성 을 크게 향상 시 켰 다.
4, 더 강 한 안전성
1) 시스템 관리 자 는 실 행 된 특정한 저장 과정 에 대해 권한 제한 을 하고 권한 이 없 는 사용자 가 데이터 에 접근 하 는 것 을 피 할 수 있다.
2) 네트워크 호출 과정 을 통 해 실행 과정 에 대한 호출 만 볼 수 있다.따라서 악성 사용 자 는 표 와 데이터베이스 대상 이름, 자신의 Transact - SQL 문 구 를 삽입 하거나 핵심 데 이 터 를 검색 할 수 없습니다.
3) 사용 과정 매개 변 수 는 SQL 주입 공격 을 피 하 는 데 도움 이 된다.실행 가능 코드 가 아 닌 문자 값 으로 매개 변수 입력 이 간주 되 기 때문에 공격 자가 명령 을 삽입 하 는 과정 에서 Transact - SQL 문 구 를 삽입 하고 안전성 을 손상 시 키 는 것 은 더욱 어 려 울 것 입 니 다.
4) 프로 세 스 를 암호 화 할 수 있 으 며 소스 코드 를 모호 하 게 처리 하 는 데 도움 이 된다.
열세:
1. 저장 과정 은 전문 적 인 데이터베이스 개발 자가 유지 해 야 하지만 실제 상황 은 프로그램 개발 자가 겸직 하 는 경우 가 많다.
2. 디자인 논리 변경, 저장 과정 수정 SQL 유연성 없 음
왜 실제 응용 에서 저장 과정 은 상대 적 으로 적 게 사용 합 니까?
일반적인 프로젝트 연구 개발 에서 저장 과정 이 상대 적 으로 적은 이 유 는 무엇 일 까?
분석 원인 은 다음 과 같다.
1) 특정 데이터베이스 개발 자 없 이 일반 프로그래머 가 데이터베이스 조작 을 겸직 한다
2) 프로그래머 는 프로그램 만 조작 하면 데이터 접근 을 완성 할 수 있 으 며 데이터베이스 에서 개발 할 필요 가 없다.
3) 프로젝트 수요 변동 이 빈번 하고 SQL 문 구 를 수정 하 는 것 이 편리 하 며 특히 논리 적 변경 과 관련된다.
저장 프로 세 스 와 SQL 문 구 는 어떻게 선택 합 니까?
실제 응용 경험 을 바탕 으로 다음 과 같은 건 의 를 한다.
1. 효율 적 이거 나 규범 적 인 요구 가 높 은 프로젝트 에서 저장 과정 을 사용 하 는 것 을 권장 합 니 다.
2. 일반 프로젝트 에 대해 매개 변수 화 명령 방식 을 사용 하 는 것 을 권장 합 니 다. 저장 과정 과 SQL 문 구 를 절충 하 는 방식 입 니 다.
3. 일부 알고리즘 에 대한 요구 가 비교적 높 고 여러 가지 데이터 논리 와 관련 되 므 로 저장 과정 을 사용 하 는 것 을 권장 합 니 다.
저장 프로시저 의 구체 적 인 응용
기초 조회
1. 매개 변수 가 없 는 저장 과정 만 들 기
예: 학생 총수 조회

--
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_COUNT
AS
SELECT COUNT(ID) FROM Students
GO

실행:

EXEC PROC_SELECT_STUDENTS_COUNT


2. 매개 변수 저장 과정

-- ,
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_CITY_COUNT', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT(@city nvarchar(50))
AS
SELECT COUNT(ID) FROM Students WHERE City=@city
GO


실행 문:

EXEC PROC_SELECT_STUDENTS_BY_CITY_COUNT N'Beijing'


3. 마스크 가 있 음
마스크, 매개 변수 값 할당 시 해당 하 는 마스크 를 추가 합 니 다.

--3、 ,
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_SURNNAME', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_BY_SURNNAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_SURNNAME
@surnName nvarchar(20)=' %' --
AS
SELECT ID,Name,Age FROM Students WHERE Name like @surnName
GO

실행:


EXEC PROC_SELECT_STUDENTS_BY_SURNNAME
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N' %'
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'% %'

4. 출력 매개 변수 가 있 음


-- ,
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_NAME', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_BY_NAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_NAME
@name nvarchar(50), --
@city nvarchar(20) out, --
@age int output --
AS
SELECT @city=City,@age=Age FROM Students WHERE Name=@name AND Age=@age
GO

실행:

--
declare @name nvarchar(50),
@city nvarchar(20),
@age int;
set @name = N' ';
set @age = 20;
exec PROC_SELECT_STUDENTS_BY_NAME @name,@city out, @age output;
select @city, @age;

2. 저장 과정 을 사용 하여 첨삭 수정
1. 새로 증가
학생 정보 추가

--1、 :
IF OBJECT_ID (N'PROC_INSERT_STUDENT', N'P') IS NOT NULL
DROP procedure PROC_INSERT_STUDENT;
GO
CREATE procedure PROC_INSERT_STUDENT
@id int,
@name nvarchar(20),
@age int,
@city nvarchar(20)
AS
INSERT INTO Students(ID,Name,Age,City) VALUES(@id,@name,@age,@city)
GO

실행:
EXEC PROC_INSERT_STUDENT 1001, N '장삼', 19, 'ShangHai'
2. 수정
학생 ID 에 따라 학생 정보 업데이트

IF OBJECT_ID (N'PROC_UPDATE_STUDENT', N'P') IS NOT NULL
DROP procedure PROC_UPDATE_STUDENT;
GO
CREATE procedure PROC_UPDATE_STUDENT
@id int,
@name nvarchar(20),
@age int,
@city nvarchar(20)
AS
UPDATE Students SET Name=@name,Age=@age,City=@city WHERE ID=@id
GO

3. 삭제
ID 에 따라 학생 기록 삭제


--3、 :
IF OBJECT_ID (N'PROC_DELETE_STUDENT_BY_ID', N'P') IS NOT NULL
DROP procedure PROC_DELETE_STUDENT_BY_ID;
GO
CREATE procedure PROC_DELETE_STUDENT_BY_ID
@id int
AS
DELETE FROM Students WHERE ID=@id
GO

실행:
EXEC PROC_DELETE_STUDENT_BY_ID 1001
3. 저장 과정 에서 페이지 별 조 회 를 실현 한다.
1 、 row 사용number 함수 페이지

--
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE', N'P') IS NOT NULL
DROP procedure PROC_SELECT_BY_PAGE;
GO
CREATE procedure PROC_SELECT_BY_PAGE
@startIndex int,
@endIndex int
AS
SELECT * FROM (SELECT ID,Name,Age,City,ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM Students) AS Temp
WHERE Temp.RowNumber BETWEEN @startIndex AND @endIndex
GO

실행:
EXEC PROC_SELECT_BY_PAGE 1,10
2. 전통 적 인 top 페이지 사용

-- TOP
IF OBJECT_ID (N'PROC_SELECT_BY_PAGE_WITH_TOP', N'P') IS NOT NULL
DROP procedure PROC_SELECT_BY_PAGE_WITH_TOP;
GO
CREATE procedure PROC_SELECT_BY_PAGE_WITH_TOP
@pageIndex int,
@pageSize int
AS
SELECT TOP(@pageSize) * FROM Students
WHERE ID >=(SELECT MAX(ID) FROM (SELECT TOP(@pageSize*(@pageIndex-1) + 1) ID FROM Students ORDER BY ID) AS Temp)
GO


실행:
EXEC PROC_SELECT_BY_PAGE_WITH_TOP 1,2
4. 기타 기능:
1. 저장 프로 세 스, 매번 실행 할 때마다 재 컴 파일


--1、 ,
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_RECOMPILE', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_RECOMPILE
with recompile --
AS
SELECT * FROM Students
GO

2. 저장 과정 을 암호 화
암호 화 후 원본 스 크 립 트 를 보고 수정 할 수 없습니다.

--2、 ,
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_WITH_ENCRYPTION', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION;
GO
CREATE procedure PROC_SELECT_STUDENTS_WITH_ENCRYPTION
with encryption --
AS
SELECT * FROM Students
GO

실행:
EXEC PROC_SELECT_STUDENTS_WITH_ENCRYPTION
효과, 스 크 립 트 를 보 거나 생 성 스 크 립 트 를 내 보 낼 수 없습니다.
[img]http://images.cnitblog.com/blog/22790/201501/201351071254540.png[/img]

좋은 웹페이지 즐겨찾기