2017-08-10 179 views
0

我在T-SQL中相當新,但我有一個關於觸發器的問題。我寫了一個觸發器,用於存儲過程中插入和更新數據。T-SQL觸發器插入更新

現在,當任何行表更新[dbo].[users]

我不知道該怎麼這樣,如果數據被插入到表[dbo].[users]激活觸發器修改此觸發器(這個工程現在)觸發的工作原理,但如何在相同的觸發器上實現更新方案,以便只有在[dbo].[users]表中只有特定的行被更新時纔會激活觸發器。

例如

  1. 如果新用戶在插入所有行插入此表 - 激活觸發器

  2. 如果舊的觸發器被更新,但只有在這個表中的特定字段更新(working_state是列的名稱),那麼只有觸發器應該被激活。

的源代碼是什麼我已經在這裏顯示:

ALTER TRIGGER [dbo].[t_temp_triger_name] 
ON [dbo].[users] 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    DECLARE @working_state char(1), 
      @user_code char(11) 

    DECLARE zm CURSOR FOR 
     SELECT 
      working_state, 
      user_code 
     FROM 
      inserted 
-- Added update statement that activates the trigger only when a specific - 
-- column update is executed 
UPDATE [dbo].[users] 
SET working_state = 1 
FROM [dbo].[users] U 
INNER JOIN DELETED D ON U.user_code= D.user_code 
WHERE U.working_state<> D.working_state 


    OPEN zm 

    FETCH NEXT FROM zm INTO @working_state, @user_code 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     EXEC [FNF].[dbo].[NamedProcedure] 
       @working_state, @user_code 

     FETCH NEXT FROM zm INTO @working_state, @user_code 
    END 

    CLOSE zm 
    DEALLOCATE zm 
END 
+0

是否有可能實現這一目標只用1個觸發? – dmxyler

回答

0

我有一個解決方案

添加到了聲明後,我的代碼

一切正常走了過來。

IF EXISTS (SELECT 1 FROM deleted) 

BEGIN 
    DECLARE zm CURSOR FOR 
SELECT 

    u.working_state, 
    u.user_code 
FROM 
    inserted U 
LEFT JOIN DELETED D ON U.user_code= D.user_code 
WHERE U.working_state<> D.working_state 
END 
    ELSE 
BEGIN 
    DECLARE zm CURSOR FOR 
SELECT 

    working_state, 
    user_code 
FROM 
    inserted 
END