정의: 트리거란 무엇입니까? 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 위치(삽입된 담배 브랜드 선택) 및
재고 수량 ac80a6c6ad8f2bd20c01edf5a9b55b9d@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 a8093152e673feb7aba1828c435320940
시작
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 a8093152e673feb7aba1828c435320940
시작
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