Database/SQL Server

SQL Server - 트리거, DML(Data Manipulation Language) trigger에 대해

청렴결백한 만능 재주꾼 2020. 12. 5. 08:17
반응형

트리거 종류 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

 

 

반응형