如果表A中的列具有特定值

时间:2018-05-16 21:10:18

标签: sql sql-server if-statement triggers

我正在尝试为用户提供某种类型的电子邮件以将用户置于正确的安全组中时创建触发器。我有一个if语句检查他们的电子邮件,但似乎它忽略了它。

      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
     ALTER TRIGGER [test].[UpdateSecurityGroup] ON  [test].[user]  

     AFTER INSERT AS begin 

     SET NOCOUNT ON;
     declare @insertedUseremail varchar; 
     select @insertedUseremail = inserted.email from inserted;    
     declare @insertedUserid int = 0;  
     select @insertedUserid = inserted.id from inserted;    

     if (@insertedUseremail like '%@test1.ca%' OR @insertedUseremail like '%@test2.ca%' OR @insertedUseremail like '%@test3.ca%' OR @insertedUseremail like '%@test4.ca%')  
     BEGIN    
     Insert into [test].[usergroup](userid,groupid) Values(@insertedUserid, 3)  
    END
    end

它将用户插入用户表,但在usergroup表中不执行任何操作。 它应该像这样插入用户组中的行。

       +----+-----------+---------+
       | ID | userid    | groupid |
       +----+-----------+---------+
       |  1 | 001       |   3     |
       |  2 | 002       |   3     |
       |  3 | 003       |   3     |
       +----+----------+----------+

2 个答案:

答案 0 :(得分:2)

假设inserted包含单行,您犯了一个严重的错误。不不不。这不是要走的路。

alter trigger [test].[UpdateSecurityGroup] on  [test].[user] after insert as
begin 
     set nocount on;

    insert into [test].[usergroup](userid, groupid) 
        select i.id, 3
        from inserted i
        where i.email like '%@test1.ca%' OR
              i.email like '%@test2.ca%' OR 
              i.email like '%@test3.ca%' OR 
              i.email like '%@test4.ca%'
end;

如果您的电子邮件真的如此,则可以将where缩短为where i.email like '%@test[1234].ca%

答案 1 :(得分:0)

您需要调试触发器。

试试这个:

  

How to debug a T-SQL trigger?

     
      
  1. 在一个窗口中创建触发器和一些测试数据(进行设置)

  2.   
  3. 打开一个新的查询窗口,然后输入" insert"。 NOT 点击"运行"爱好。

  4.   
  5. 在该行设置断点

  6.   
  7. 启动调试器(从菜单或工具栏调试或Alt-F5)

  8.   
  9. 进入触发器(F11)

  10.