2017-12-29 7 views
0

되어 다음 컬럼 :동일한 테이블의 UPDATE 트리거에서 테이블의 열을 업데이트하는 방법은 무엇입니까? 내 테이블 <code>Table1</code>에서

Id(identity), Field1(VARCHAR), Field2(VARCHAR), Field3(CHAR) 

내가이 테이블의 Field1의 UPDATE에 트리거가 : 그래서

CREATE TRIGGER [dbo].[My_TRG] ON [dbo].[Table1] 
FOR UPDATE 
NOT FOR REPLICATION 
AS 
DECLARE @Id INT... 
..... 
..... 
BEGIN 
..... 
SELECT @Id = Id FROM Inserted 
UPDATE [Table1] SET [Field3] = 'NEW' WHERE [Field3] IS NULL AND [email protected] 
..... 
..... 
END 

, I는 같은 레코드에 대해 동일한 테이블의 다른 열을 업데이트하고있다 UPDATE 트리거에서 업데이트됩니다. 위의 트리거에서 @Id은 업데이트되는 레코드의 식별자입니다.

UPDATE 문이 이전에 없었으므로 트리거가 정상적으로 작동했습니다. 이제 트리거에서 UPDATE 문을 추가해야합니다.

그것은 다음과 같은 예외가 발생합니다 :

행을 업데이트하기위한 찾을 수 없습니다. 마지막으로 읽은 이후에 일부 값이 변경되었을 수 있습니다.

Field3에 대한 기본값을 설정할 수 없습니다. Field3은 값이 Field1 인 경우에만 설정해야합니다. 그렇지 않은 경우 null이어야합니다.

어떻게해야합니까?

+0

기본값을 추가하려고합니까? 그런 다음 기본값을 사용하십시오! https://www.w3schools.com/sql/sql_default.asp –

+1

트리거는 * 행당 한 번 * 실행되지 않고 명령문 * 당 한 번 실행됩니다. 즉, 업데이트 된 0, 1 또는 * multiple * 행을 처리 할 수있는 코드를 작성해야합니다. (현재의 문제와 관련이 없지만 염두에 두어야 할 가치가 있음) –

+0

그건 방아쇠가하는 것이 아닙니다. 어쨌든 ... 왜 계산 된 열을 사용하지 않으시겠습니까? –

답변

1

코드가 (당신이 그것을 작동하게하는 경우) 당신이 INSERTED 테이블과 테이블에 가입해야하므로, 단지 1 행을 업데이트하고, Column3 IS NOT NULL하고 NULL 교체 여부를 확인하기 위해 CASE expressin을 사용하는 동안, 모든 행을 업데이트해야 트리거 값이 'NEW' :

UPDATE Tbl 
SET Column1 = I.Column1, 
    Column2 = I.Column2, 
    Column3 = (CASE WHEN I.Column3 IS NOT NULL THEN 'NEW' END) 
FROM Table1 Tbl INNER JOIN INSERTED I ON Tbl.ID = I.ID;