정의: 트리거란 무엇입니까? SQL Server에서는 특정 테이블에 대해 특정 작업을 수행하고 특정 조건을 트리거하여 실행되는 프로그램입니다. 트리거는 특별한 저장 프로시저입니다.
삽입, 업데이트 및 삭제 이벤트에 각각 적용되는 세 가지 일반적인 트리거가 있습니다.
트리거를 사용해야 하는 이유는 무엇인가요? 예를 들어 다음 두 테이블은
Create Table Student( --学生表 StudentID int primary key, --学号 .... )
Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... )
사용되는 기능은 다음과 같습니다.
1. 학생의 학생 ID를 변경하더라도 해당 학생의 대출 기록이 여전히 학생과 관련되어 있기를 바랍니다. 학번도 동시에 변경됨)
2. 학생이 졸업했다면 학번도 삭제하고 도서대출기록도 삭제하고 싶습니다.
잠깐만요.
이때 트리거를 사용할 수 있습니다. 1의 경우 업데이트 트리거를 만듭니다.
트리거 truStudent 만들기
학생에서 -- 업데이트를 위한 학생 테이블
에 트리거를 만듭니다. ~ 다음에 수행할 작업
업데이트(StudentID)인 경우
시작
BorrowRecord 업데이트
Set StudentID=i.StudentID
From BorrowRecord br , 삭제됨 d ,삽입 i --삭제 및 삽입된 임시 테이블
여기서 br.StudentID=d.StudentID
end
트리거의 두 임시 테이블인 삭제됨, 삽입됨을 이해합니다. 삭제됨과 삽입됨은 각각 이벤트를 트리거한 테이블의 "이전 레코드"와 "새 레코드"를 나타냅니다.
데이터베이스 시스템에는 테이블의 변경 사항을 기록하는 정보를 저장하는 데 사용되는 두 개의 가상 테이블이 있습니다.
가상 테이블 삽입된 가상 테이블 삭제됨
새 테이블 기록 시 새로운 추가 저장 추가됨, 새로 추가됨 새 추가됨 레코드는 레코드를 저장하지 않습니다. 수정 시 업데이트 전 레코드를 업데이트하고 저장하는 데 사용된 새 레코드를 저장합니다.
삭제 시 레코드를 표시합니다: 삽입된 항목에 새 레코드를 생성합니다. 테이블에서 이전 기록을 삭제됨 테이블에 복사한 다음 학생 기록을 삭제하고 새 기록을 작성합니다.
2의 경우 삭제 트리거 생성
트리거 생성 trdStudent
On Student
for 삭제
As
BorrowRe 코드 삭제
From BorrowRecord br , Delted d
br.StudentID=d.StudentID
이 두 가지 예에서 트리거의 핵심을 볼 수 있습니다. A. 2개의 임시 테이블 B. 트리거 메커니즘.
SQL 트리거 인스턴스 2
/*
테이블 [담배 재고 테이블], 테이블 [담배 판매 테이블]을 포함하는 가상 테스트 환경을 구축합니다.
이 두 테이블의 데이터를 추적하는 데 주의를 기울여 트리거가 실행하는 비즈니스 로직이 무엇인지, 데이터에 어떤 영향을 미치는지 이해하시기 바랍니다.
트리거의 역할을 보다 명확하게 표현하기 위해 테이블 구조는 데이터 중복성을 가지며 제3정규형을 따르지 않습니다.
*/
USE 마스터
GO
IF EXISTS(XTYPE = 'U' AND NAME = '담배 재고 테이블'인 SYSOBJECTS에서 이름 선택)
DROP TABLE 담배 재고 테이블
GO
존재하는 경우(XTYPE = 'U' AND NAME = '담배 판매표'인 SYSOBJECTS에서 이름 선택)
DROP TABLE 담배 판매표
GO
--비즈니스 규칙: 판매 금액 = 판매 수량 * 판매 단가 비즈니스 규칙.
CREATE TABLE 담배 판매 테이블
(
담배 브랜드 VARCHAR(40) PRIMARY KEY NOT NULL,
구매자 VARCHAR(40) NULL,
판매 수량 INT NULL,
판매 단가 MONEY NULL,
판매 금액 MONEY NULL
)
GO
--비즈니스 규칙: 재고 금액 = 재고 수량 * 재고 단가 비즈니스 규칙입니다.
CREATE TABLE 담배 재고 테이블
(
담배 브랜드 VARCHAR(40) PRIMARY KEY NOT NULL,
재고 수량 INT NULL,
재고 단가 MONEY NULL,
재고 Amount MONEY NULL
)
GO
--트리거 생성, 예 1
/*
트리거 생성 [T_INSERT_cigarette Inventory Table], 이 트리거는 더 간단합니다.
설명: [담배 재고 테이블]에서 INSERT 작업이 발생할 때마다 이 트리거가 실행됩니다.
트리거 기능: 삽입된 데이터에서 재고 금액 = 재고 수량 * 재고 단가가 되도록 비즈니스 규칙을 적용합니다.
참고: [INSERTED] 및 [DELETED]는 시스템 테이블이므로 생성, 수정, 삭제할 수 없지만 호출할 수는 있습니다.
중요: 이 두 시스템 테이블의 구조는 데이터가 삽입되는 테이블의 구조와 동일합니다.
*/
존재하는 경우(XTYPE = 'TR' AND NAME = 'T_INSERT_Cigarette Inventory Table'인 SYSOBJECTS에서 이름 선택)
DROP TRIGGER T_INSERT_Cigarette Inventory Table
GO
트리거 생성 T_INSERT_Cigarette Inventory Table
ON Cigarette Inventory Table
FOR INSERT
AS
--트랜잭션 처리 제출
BEGIN TRANSACTION
--비즈니스 규칙을 보장하기 위해 다음 문을 강제로 실행합니다.
UPDATE 담배 재고 테이블
SET 재고 금액 = 재고 수량 * 재고 단가
WHERE 담배 브랜드 IN(INSERTED에서 담배 브랜드 선택)
COMMIT TRANSACTION
GO
/ *
[담배 재고표]에 대한 테스트 데이터 삽입:
첫 번째 데이터(홍타산 뉴포스)의 데이터는 비즈니스 규칙을 준수하며,
두 번째 데이터(홍타산 휴먼피크)에 있는 데이터입니다. , [재고량]이 비어 있어 비즈니스 규칙을 준수하지 않습니다.
세 번째 데이터(운남 이미지)에서 [재고량]은 [재고 수량]에 [재고 단가]를 곱한 값과 동일하지 않습니다. , 이는 비즈니스 규칙을 준수하지 않습니다.
네 번째 데이터 인벤토리 수량은 0입니다.
데이터 삽입 후 [담배 재고표]의 데이터가 재고 금액 = 재고 수량 * 재고 단가인지 확인하시기 바랍니다.
*/
INSERT INTO 담배 재고 테이블(담배 브랜드, 재고 수량, 재고 단가, 재고 금액)
SELECT 'Hongtashan New Force',100,12,1200 UNION ALL
SELECT '홍타산 인공봉',100,22,NULL UNION ALL
SELECT '운남 이미지',100,60,500 UNION ALL
SELECT 'Yuxi',0,30,0
GO
--쿼리 데이터
SELECT * FROM 담배 재고 테이블
GO
/*
결과 세트
RecordId 담배 브랜드 재고 수량 재고 단가 재고 금액
--------- --- -------- ------- -------- -
1 홍타산 신군 100 12.0000 1200.0000
2 홍타산 인공봉 100 22.0000 2200.0000
3 운남 이미지 100 60.0000 6000.0000
4 우희 0 30.0000 .0 000
(개수 영향을 받는 줄은 4줄입니다.)
*/
--트리거 예 2
/*
더 복잡한 트리거 [T_INSERT_Cigarette Sales Table]를 만듭니다.
설명: [담배 재고 테이블]에서 INSERT 작업이 발생할 때마다 이 트리거가 실행됩니다.
트리거 기능: 비즈니스 규칙을 구현합니다.
비즈니스 규칙: 판매된 담배 브랜드의 재고가 없거나 재고가 0인 경우 오류가 반환됩니다.
그렇지 않으면 [담배 재고표]에 있는 해당 브랜드의 담배 재고 수량 및 금액이 자동으로 감소됩니다.
*/
존재하는 경우(XTYPE = 'TR' AND NAME = 'T_INSERT_Cigarette Sales Table'인 SYSOBJECTS에서 이름 선택)
DROP TRIGGER T_INSERT_Cigarette Sales Table
GO
CREATE TRIGGER T_INSERT_Cigarette Sales Table
ON Cigarette Sales Table
FOR INSERT
AS
BEGIN TRANSACTION
--데이터의 합법성을 확인하세요. 판매된 담배의 재고가 있는지 아니면 재고가 더 큰지 확인하세요. 0보다
IF NOT EXISTS (
재고 수량 선택
담배 재고 테이블에서
WHERE 담배 브랜드 IN (SELECT 담배 브랜드 FROM INSERTED)
)
시작
-- 반환 오류 메시지
RAISERROR('오류! 이 담배는 재고가 없어 판매할 수 없습니다.',16,1)
--롤백 거래
ROLLBACK
RETURN
END
존재하는 경우(
재고 수량 선택
담배 재고 목록에서
담배 브랜드 IN 위치(삽입된 담배 브랜드 선택) 및
재고 수량 <= 0
)
BEGIN
--오류 메시지 반환
RAISERROR('오류! 담배 재고가 0보다 작거나 같으며 판매할 수 없습니다.',16,1)
-거래 롤백
ROLLBACK
RETURN
END
--법률 데이터 처리
--비즈니스 규칙을 보장하기 위해 다음 문을 시행합니다.
UPDATE 담배 판매표
SET 판매 금액 = 판매 수량 * 판매 단가
WHERE 담배 브랜드 IN (SELECT 담배 브랜드 FROM INSERTED)
DECLARE @Cigarette Brand VARCHAR(40)
SET @Cigarette Brand = (SELECT 담배 브랜드 FROM INSERTED)
DECLARE @Sales Quantity MONEY
SET @Sales Quantity = (삽입된 판매 수량 선택)
UPDATE 담배 재고 테이블
SET 재고 수량 = 재고 수량 - @Sales Quantity,
재고 금액 = (재고 수량 - @판매 수량)*재고 단가
WHERE 담배 브랜드 = @Cigarette 브랜드
COMMIT TRANSACTION
GO
--[담배 재고 목록을 계속 추적하세요. ] 및 [담배]를 직접 판매표] 데이터로 변경합니다.
--[담배 판매표]에는 첫 번째 테스트 데이터를 삽입하는데 이는 정상적인 것입니다.
INSERT INTO 담배 판매 테이블(담배 브랜드, 구매자, 판매 수량, 판매 단가, 판매 금액)
SELECT '홍타산 뉴포스','a 구매자',10,12,1200
GO
--[담배 판매 테이블]에 두 번째 테스트 데이터를 삽입합니다. 데이터 판매 금액은 판매 단가 * 판매 수량과 다릅니다.
--트리거는 판매량이 판매 단가 * 판매 수량과 동일하도록 데이터를 자동으로 수정합니다.
INSERT INTO 담배 판매 테이블(담배 브랜드, 구매자, 판매 수량, 판매 단가, 판매 금액)
SELECT 'Hongtashanrenrenfeng','a 구매자',10,22,2000
GO
--[담배 판매 테이블]에 세 번째 테스트 데이터를 삽입합니다. 이 데이터의 담배 브랜드는 담배 재고 테이블에서 찾을 수 없습니다.
--트리거가 오류를 보고합니다.
INSERT INTO 담배 판매 테이블(담배 브랜드, 구매자, 판매 수량, 판매 단가, 판매 금액)
SELECT 'Honghe V8','a 구매자',10,60,600
GO
/*
결과 세트
서버: 메시지 50000, 레벨 16, 상태 1, 프로세스 T_INSERT_Cigarette Sales Table, Row 15
오류! 담배는 재고가 없어 판매할 수 없습니다.
*/
--[담배 판매 테이블]에 세 번째 테스트 데이터를 삽입합니다. 이 데이터의 담배 브랜드는 담배 재고 테이블에서 0의 재고를 갖습니다.
--트리거가 오류를 보고합니다.
INSERT INTO 담배 판매 테이블(담배 브랜드, 구매자, 판매 수량, 판매 단가, 판매 금액)
SELECT 'Yuxi','a 구매자',10,30,300
GO
/*
결과 세트
서버: 메시지 50000, 레벨 16, 상태 1, 프로세스 T_INSERT_Cigarette Sales Table, Row 29
오류! 담배 재고가 0 이하이므로 판매할 수 없습니다.
*/
--데이터 쿼리
SELECT * FROM 담배 재고 테이블
SELECT * FROM Cigarette Sales Table
GO
/*
보충:
1. 이 예는 주로 간단한 비즈니스 규칙 구현을 통한 트리거 사용을 설명합니다. 유연하게 처리해야 합니다.
2. 트리거와 관련하여 INSERTED 및 DELETED 두 가지 시스템 테이블을 이해하고 사용해야 합니다.
3. 이 예에서 생성된 트리거는 모두 FOR INSERT를 참조하세요. :
///////////////////////////////////////////// //////// ///////////////////////////////////////// //////////// ////////////////////////////
///////////////////////////////////////////// /// ////////////////////////////////////////////// ////// ////////////////////////////
트리거 생성 Trigger_name
ON { 테이블 | 보기 }
[ WITH ENCRYPTION ] - 암호화된 트리거에 사용됩니다.
{
{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ 업데이트 ] }
[ WITH APPEND ]
[ 복제용 아님 ]
AS
[ { IF UPDATE( 열 )
[ { AND | OR } UPDATE( 열 ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { 비트별 연산자 } 업데이트된_비트마스크 )
{ 비교 연산자 } 열_비트마스크 [ ...n ]
} ]
sql_statement [ ...n ]
}
}
4 , 트리거와 관련하여
(1), DELETE 트리거는 TRUNCATE TABLE 문을 캡처할 수 없다는 점에도 유의해야 합니다.
(2) 다음 Transact-SQL 문은 트리거에서 허용되지 않습니다.
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
(3) 트리거는 최대 32레벨까지 중첩될 수 있습니다.
*/
--트리거 수정
--기본적으로 CREATE TRIGGER...를 ALTER TRIGGER로 변경합니다....
--트리거 삭제
DROP TRIGGER xxx
GO
--테스트 환경 삭제
DROP TABLE 담배 재고 테이블
GO
DROP TABLE 담배 판매 table
GO
DROP TRIGGER T_INSERT_담배 재고 테이블
GO
DROP TRIGGER T_INSERT_담배 판매 테이블
GO
############ ##### #########################################
기본 트리거에 대한 지식 및 예
: 테이블/뷰에서
트리거 생성
{for | after 대신 } [update][,][insert][,] [delete]
[with 암호화]
as {batch | if update (col_name) [{and|or} update (col_name)] }
설명:
1 tr_name: 테이블/뷰의 트리거 이름
2 : 트리거가 작동하는 테이블입니다. 트리거는 트리거 이벤트가 발생할 때
3 이후: 동의어
4 이후 및 대신: sql 2000 새 항목 하나의 테이블에서만 작동할 수 있습니다.
이후
대신 afrer와 차이가 있습니다. 나중에 활성화되며
대신 해당 트리거 이벤트가 실행됩니다.
5 삽입, 업데이트, 삭제 : 트리거를 활성화하는 세 가지 작업을 동시에 수행하거나 둘 중 하나를 선택할 수 있습니다.
6 if update (col_name): 해당 작업이 지정된 열에 영향을 미치는지 여부를 나타냅니다. 방아쇠. 또한 삭제 작업은 행에만 영향을 주기 때문에
삭제 작업을 사용하면 이 문을 사용할 수 없습니다(사용에 오류는 없지만 트리거를 활성화할 수 없으므로 의미가 없습니다).
7 트리거 실행 시 사용되는 두 가지 특수 테이블: 삭제, 삽입
삭제 및 삽입은 특수 임시 테이블이라고 할 수 있으며, 트리거 활성화 시 시스템에서 자동으로 생성되는 테이블 구조입니다. by Triggers는 동일하지만 저장되는 데이터가 다릅니다.
계속
삭제된 데이터와 삽입된 데이터의 차이점을 설명하는 표입니다.
삭제된 데이터와 삽입된 데이터의 차이점
삽입됨
삽입 및 업데이트 작업 후 데이터를 저장합니다.
삭제됨
삭제 및 업데이트 작업 전 데이터 저장
참고: 업데이트 작업은 먼저 삭제한 후 삽입하는 것과 동일하므로 업데이트 작업을 수행하면 수정 전 데이터가 삭제된 테이블에 복사되고 수정된 데이터가
트리거가 적용된 테이블에 데이터가 저장되면 삽입된 테이블에도 복사본이 생성됩니다.
/////////
트리거 생성 [TRIGGER admixture_receive_log] ON dbo.chl_lydj
업데이트
AS
시작
declare @djsfxg char(10) declare @wtbh char(20)
@wtbh= 선택 wtbh에서 삽입됨
update ly_tzk set djsfxg='已修改' 여기서 wtbh=@wtbh
end
if (t_logsetup에서 data_sfjl 선택)='是'
begin
declare @old cjmc 문자( 100) @oldlyrq 날짜 시간 선언
@oldbzbh char 선언(60) @oldzl char 선언(20)
@olddj char 선언(10)
@newcjmc 문자 선언( 100) @newlyrq 날짜 시간 선언
@newbzbh char 선언(60) @newzl char 선언(20)
@newdj char 선언(10)
@xgr 문자 선언( 20)
@oldcjmc=cjmc,@oldlyrq=lyrq,@oldbzbh=bzbh,@oldzl=zl,@olddj=dj 삭제된 항목에서 선택
@newc 선택 jmc=cjmc, @newlyrq=lyrq,@newbzbh=bzbh,@newzl=zl,@newdj=dj 삽입됨
t_modifyuser에서 @xgr=xgr 선택(@wtbh=wtbh
if @oldcjmc<>@newcjmc
시작
t_modifylog에 삽입(wtbh, mod_time, mod_table, mod_field, ori_value, now_value, mod_people) 값
(@wtbh,getdate(), 'chl_lydj','cjmc', @oldcjmc, @newcjmc , @xgr)
end
end
/////////修改时,直接把'create'改为'alter'即可
////////////////////////////////////
트리거 만들기 [TRIGGER ly_tzk_syf] ON dbo.ly_tzk
삽입용
AS
시작
선언 @clmc char(100) 선언 @dwbh char(100) 선언 @syf char( 100) 선언 @ dwgcbh char(100) declare @wtbh char(50)
declare @dj_1 money declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money
@dj char 선언(20)
@wtbh=wtbh 선택 , @clmc=clmc , @dwbh=dwbh ,@syf=syf 에서 삽입됨
선택 @dj=dj from feihao_bz 여기서 clmc=@clmc
선택 @feiyong_z=feiyong_z, @feiyong_xf=fei yong_xf, @feiyong_sy=feiyong_sy 에서 gongchengxinxi dwgcbh=@dwbh
set @dj_1=convert(money ,@dj)
if @dj_1 <>0
시작
set @feiyong_xf=@feiyong_xf+@dj_1
set @feiyong_sy=@feiyong_sy- @dj_1
업데이트 ly_tzk set syf=@dj 여기서 wtbh=@wtbh
업데이트 gongchengxinxi set feiyong_xf=@feiyong_xf, fe iyong_sy=@feiyong_sy 여기서 dwgcbh=@dwbh
끝
else 업데이트 ly_tzk set syf=convert(char , 0.0) 여기서 wtbh=@wtbh
end
/////////// ///////////
트리거 생성 [TRIGGER ly_tzk_syf_shanchu] ON dbo.ly_tzk
삭제용
AS
시작
선언 @clmcchar(100) 선언 @dwbh char(100) 선언 @dwgcbh char(100) 선언 @wtbh char(50)
선언 @feiyong_z 돈 선언 @feiyong_xf 돈 de clare @feiyong_sy 돈
@syf char 선언( 100) declare @syf_1 money
--declare @dj char(20) declare @dj_1 money
@wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@ 선택 syf=syf 삽입된 항목
--feihao_bz에서 @dj=dj 선택, clmc=@clmc
gongchengxinxi에서 @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy 선택, dwgcbh=@dwbh
set @syf_1=convert(money ,@syf)
if @syf_1 <>0
시작
set @feiyong_xf=@feiyong_xf-@syf_1
설정 @feiyong_sy=@feiyong_sy+@syf_1
업데이트 gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy dwgcbh=@dwbh
end
end