2017-08-10 154 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