반응형
트리거 종류 Trigger types
1. DML(Data Manipulation Language) triggers - 뷰나 테이블 관련하여 DML문의가 발생될 때 작동
2. DDL(Data Definition Language) triggers - 서버나 데이터베이스에 DDL문의가 발생될 때 작동
3. Logon trigger - 사용자의 로그온 이벤트가 발생될 때 작동
DML triggers Types
1. After triggers
INSERT, UPDATE, DELETE 등의 이벤트가 발생 되고 난 뒤에 작동. 테이블에만 작동하고 뷰에선 작동 안함.
2. Instead of triggers
INSERT, UPDATE, DELETE 등의 이벤트가 발생하기 전에 작동하는 트리거. 테이블과 뷰 다 작동이 되며 주로 뷰를 업데이트할 때 사용이 된다.
After Triggers example
FOR자리에 AFTER를 대체하여도 상관이 없다.
After Triggers는 백업테이블에 로그를 남기는 용도로 생각하면 쉽다. 수정, 삭제, 삽입이 된 경우 로그가 백업 테이블에 기록되기 하는 용도.
CREATE TRIGGER tr_tblEmployee_ForInsert
ON tblEmployee
FOR INSERT
AS
BEGIN
DECLARE @ID int
SELECT @ID = ID FROM inserted
insert into tblEmployeeAudit
values ('New employee with id = ' +
Cast(@id as nvarchar(5)) +
' is added at ' +
Cast(Getdate() as nvarchar(20))
)
END
Instead of trigger
이거는 복합 뷰가 완성되어 있을 때 하나의 row를 추가하려고 하는 상황에서,,, 바로 추가하면 여러테이블에 영향이 간다고 에러가 난다.
여기서 instead of trigger를 만들어서 비록 그냥 복합뷰에 add를 하지만 trigger를 이용하여 조인된 각 테이블에 insert가 된다.
Create trigger tr_vWEmployeeDetails_InsteadOfInsert
On vWEmployeeDetails
Instead Of Insert
as
Begin
Declare @DeptId int
--Check if there is a valid DepartmentId
--for the given DepartmentName
Select @DeptId = DeptId
from tblDepartment
join inserted
on inserted.DeptName = tblDepartment.DeptName
--If DepartmentId is null throw an error
--and stop processing
if(@DeptId is null)
Begin
Raiseerror('Invalid Department Name. Statement terminated', 16, 1)
return
End
--Finally insert into tblEmployee table
Insert into tblEmployee(Id, Name, Gender, DepartmentId)
Select Id, Name, Gender, @DeptId
from inserted
End
반응형
'Database > SQL Server' 카테고리의 다른 글
SQL Server - 수정가능한 공통 테이블 식(Updateable Common Table Expression) (0) | 2020.12.08 |
---|---|
MS SQL-파생 테이블 정리 & 공통 테이블 식(CTE) in SQL Server (0) | 2020.12.08 |
MS SQL - 인덱스 뷰 Indexed View (0) | 2020.12.05 |
MS SQL - 뷰란 ? What is a View? (0) | 2020.12.05 |
MS SQL - 인덱스의 장점 & 단점 / Advantages and disadvantages of indexes (0) | 2020.12.04 |