2016-07-10 2 views
0

업데이트를 차단하고 테이블 Service을 삭제하기 위해 SQL Server 트리거를 만들어야합니다.SQL Server 트리거의 IF 문

이 작업은 State 샘플 데이터가 "완료되었습니다"Service에만 수행되어야합니다.

State 샘플 데이터가 "활성"인 Service으로 업데이트하고 삭제할 수 있어야합니다.

이것은 내가 시도한 것으로 else 작업을 수행하는 데 문제가 있습니다 (State 샘플 데이터가 "활성"인 Service에 대한 업데이트를 허용 함). 내가 제대로 이해 그래서 경우

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR INSERT, UPDATE, DELETE 
AS 
    DECLARE @para varchar(10), 
      @results varchar(50) 

    SELECT @para = Status 
    FROM Service 

    IF (@para = 'completed') 
    BEGIN 
     SET @results = 'An invoiced service cannot be updated or deleted!'; 
     SELECT @results; 
    END 

BEGIN 
    RAISERROR ('An invoiced service cannot be updated or deleted', 16, 1) 
    ROLLBACK TRANSACTION 

    RETURN 
END 
+0

업데이트 및 삭제를 차단하려면 'INSERT'에 트리거가있는 이유는 무엇입니까? 또한 : 당신이 * 행 *이 업데이트 (또는 삭제)되었음을 알려주는'Deleted'와'Inserted' 의사 테이블을 결코 보지 못했기 때문에 - 이것이 작동하지 않을 것입니다 ...... –

+0

'송장 된 서비스를 업데이트하거나 삭제할 수 없습니다!'라는 값이 표시됩니다. 하지만 if 조건을 검사하는지 여부는 확실하지 않습니다. – Ayyub

답변

1

, 어떤 UPDATE 또는 DELETEState 열이 Active의 값이있는 경우 허용되지만 다른 경우에는 중지해야?

그 때 나는이 작업을 수행 할 것 :

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR UPDATE, DELETE 
AS 
BEGIN 
    -- if any row exists in the "Deleted" pseudo table of rows that WERE 
    -- in fact updated or deleted, that has a state that is *not* "Active" 
    -- then abort the operation 
    IF EXISTS (SELECT * FROM Deleted WHERE State <> 'Active') 
     ROLLBACK TRANSACTION 

    -- otherwise let the operation finish 
END 

을 참고로 : 당신이 쉽게 (SELECT @Results로) 트리거 메시지를 반환하지 수 - 트리거는 자동으로 현재 활성화 된 트랜잭션 (transaction)

를 롤백에 의해 실패
+0

"인보이스 된 서비스를 업데이트하거나 삭제할 수 없습니다!"라는 출력을 반환해야한다면 어떻게해야합니까? 완료된 서비스. – Ayyub

+0

이 코드를 실행하면 "END 근처에 잘못된 구문이 있습니다."오류가 반환됩니다. – Ayyub

+0

@Ayyub : 내가 말하려고했던 것처럼 : 방아쇠에서 아무 것도 반환 할 수 없습니다. 메시지도없고 숫자도 없습니다. 방아쇠는 백그라운드에서 조용히 작동합니다. 이와 같은 메시지가 필요하다면, 그 작업이 허용되는지 아닌지를 확인하기 위해 * before * 삭제/업데이트를 확인해야합니다. –