2017-12-29 68 views
0

여러 트리거를 만들려고합니다. Crystal Reports에서 같은 양식의 '재 인쇄'필드가 업데이트되면 하나의 트리거가 'ysnAcknowledged'필드를 업데이트합니다. 두 번째 트리거는 사용자가 'ysnAcknowledged'필드를 수동으로 업데이트하는 경우 (양식 확인란) '재 인쇄'필드를 업데이트해야합니다. 나는 첫 번째 방아쇠를 가지고 있는데, 내 문제는 'ysnAcknowledged'필드를 업데이트하면 두 번째 방아쇠가 효과적으로 이동하기 전에 첫 번째 방아쇠를 뒤집을 것이다.SQL 트리거를 만들어 이전 트리거를 뒤집습니다.

1 트리거 :

CREATE TRIGGER SOPickListReprint 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

IF UPDATE(Reprint) 
UPDATE dbo.SalesOrder 
SET ysnAcknowledged = 1 

2 트리거 :

CREATE TRIGGER SOPickListUpdate 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

IF UPDATE(ysnAcknowledged) 
UPDATE dbo.SalesOrder 
SET Reprint = 0 
+0

가 단일 트리거를합니까? * (두 개 이상의 행이 변경 될 수 있음을 염두에 두십시오.이 트리거는 단 하나의 행만 변경 한 다음 테이블의 모든 행을 업데이트합니다.) * – MatBailie

+0

트리거는 ** 벤더에 따라 다르며 ** - 따라서 태그를 추가하십시오 'mysql','postgresql','sql-server','oracle' 또는'db2' 중 어느 것을 사용 하는지를 지정하기 위해서입니다. –

+0

당신이 정확합니다! 이것은 MSSQL입니다. –

답변

0

내 솔루션 :

CREATE TRIGGER SOPickListReprint 
ON dbo.SalesOrder 
AFTER UPDATE 
AS 

UPDATE dbo.SalesOrder 
SET ysnAcknowledged = CASE WHEN deleted.Reprint = 0 AND inserted.Reprint = 1 THEN 1 ELSE inserted.ysnAcknowledged END, 
Reprint = CASE WHEN deleted.ysnAcknowledged = 1 AND inserted.ysnAcknowledged = 0 THEN 0 ELSE inserted.Reprint END 
FROM SalesOrder 
INNER JOIN 
inserted 
    ON inserted.SalesOrderID = SalesOrder.SalesOrderID 
INNER JOIN 
deleted 
    ON deleted.SalesOrderID = SalesOrder.SalesOrderID 
+0

WHERE 절이 없으면 다른 필드가 변경된 * 행을 불필요하게 * 처리하고 다시 작성합니다. – MatBailie

+0

@ MatBailie, 정확합니다. 나는 고쳐 줄 것이다, 고마워! –

1
CREATE TRIGGER SOPickListUpdate 
    ON dbo.SalesOrder 
    AFTER UPDATE 
AS 

-- Update only rows where Reprint changed or ysnAcknowledged changed 
-- > If ysnAcknowledged changed, force Reprint to 0, otherwise leave it as it is 
-- > If Reprint changed, force ysnAcknowledged to 1, otherwise leave it as it is 
UPDATE 
    SalesOrder 
SET 
    Reprint   = CASE WHEN inserted.ysnAcknowledged <> deleted.ysnAcknowledged THEN 1 ELSE inserted.Reprint END, 
    ysnAcknowledged = CASE WHEN inserted.Reprint   <> deleted.Reprint   THEN 0 ELSE inserted.ysnAcknowledged END 
FROM 
    SalesOrder 
INNER JOIN 
    inserted 
     ON inserted.<primary_key> = SalesOrder.<primary_key> 
INNER JOIN 
    deleted 
     ON deleted.<primary_key> = SalesOrder.<primary_key> 
WHERE 
     inserted.ysnAcknowledged <> deleted.ysnAcknowledged 
    OR inserted.Reprint   <> deleted.Reprint 
+0

@ MatBailie, 하나의 테이블로 작업하고 있습니다. 삽입 및 삭제가 정의되지 않았습니다. 나는 이것이 어떻게 작동해야하는지 이해하지 못하고있다. –

+0

'inserted '및'deleted'는 SQL Server가 트리거 내부에서 사용하기 위해 제공하는 메타 테이블입니다. SQL Server 트리거에 대한 설명서 및/또는 자습서를 읽는 것이 좋습니다. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql * ('[inserted]'는 INSERTED 또는 UPDATED로 된 모든 행을 포함하고, [deleted]는 모든 것을 포함한다. 행 DELETED 또는 UPDATE;'DELETE'와 'INSERT' ...로 표현되는'UPDATE') * – MatBailie

+0

당신의 도움에 감사드립니다! 이것이 내가 끝낸 것입니다 : –