2014-10-03 6 views
0

업데이트를 수행 한 후에 실행되는 트리거를 쓰려고합니다. 트리거가 업데이트 된 마지막 행을 업데이트하고 ACTION_TYPE이라는 ​​필드를 "changed"문자열로 채 웁니다.업데이트 후 SQL 트리거 값이있는 필드 업데이트

표 구조

USE BillingUI; 

CREATE TABLE tbl8_update_transactions 
(
    TID INT IDENTITY PRIMARY KEY, 
    TABLE_NUMBER nchar(2) NOT NULL, 
    HOLIDAY_DATE nchar(8) NOT NULL, 
    FIELD_DESCRIPTION nVARchar(43) NULL, 
    ACTION_TYPE nchar(6) NULL, 
    HID int, 

    FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID) ON DELETE CASCADE 
); 

트리거

CREATE TRIGGER tbl8_ins 
ON tbl8_update_transactions 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE tbl8_update_transactions 
    SET ACTION_TYPE = "change" 
    WHERE TID = inserted.TID; 
END 

나는 다음과 같은 오류를 얻을 :

잘못된 열 이름 "변화". - 변경 이유가 열 이름이라고 생각하는 이유를 모르겠습니다.

다중 부분 식별자 "inserted.TID"를 바인딩 할 수 없습니다. - 나는이 중 하나의 구문에 대해 확신이 없으며, 방금 업데이트 된 행에서 업데이트를 수행하려고합니다.

+0

방아쇠 방아쇠는 ** 행당 한 번 ** ** ** ** 사례가 아닌 것으로 간주됩니다. 트리거는 ** 명령문 ** 당 한 번 실행됩니다. 따라서 UPDATE 문이 25 개의 행에 영향을 주면 트리거가 ** 한번 ** 발생하지만 Inserted와 Deleted는 각각 25 개의 행을 포함합니다 . 다음 중 25 개의 행 중에서 코드가 여기에서 선택됩니다 : '.... WHERE TID = inserted.TID' - 비 결정적입니다. 이것을 고려하려면 트리거를 다시 작성해야합니다! –

답변

0

'변경'주위의 인용 부호에 단일 틱을 사용하고, From 절에 INSERTED 참조를 사용하십시오.

UPDATE tbl8_update_transactions 
SET ACTION_TYPE = 'change' 
FROM inserted 
WHERE tbl8_update_transactions.TID = inserted.TID; 
+0

이 대답에서 알 수 있듯이 트리거는 개별 행이 아닌 SET에서 발생합니다. "삽입 된"테이블에는 N 개의 행이 있습니다. 단 하나가 아닙니다. (단 하나의 행을 업데이트하는 것이 아니라 로직이 세트 기반을 위해 작성되어야 함) – granadaCoder

+0

필드 TID가 모호합니다. 또한 한 번에 한 행만 업데이트하므로 걱정할 필요가 없습니다. – Dave

+0

아아, 모호한 입력란에 대해 사과드립니다. 업데이트 참조를 포함하도록 편집했습니다. – Greenspark

0

작은 따옴표를 사용해야합니다.

SET ACTION_TYPE = 'change' 

SQL Server의 값에는 큰 따옴표를 사용할 수 없습니다.