【问题标题】:i want to make conditional trigger in sql server......我想在sql server中做条件触发......
【发布时间】:2013-07-25 18:55:17
【问题描述】:

我有一个名为 test 的表和另一个名为 trigg 的表......我想要的是......每当插入“name”为“rakesh”的数据进行测试......它应该触发一个触发器在“trigg”表中插入年龄....

我自己试过了....检查一下...

create trigger trigger1 
on test
after insert
as
if((select name from test) like 'rakesh')
begin 
insert into trigg(age)
select name from test
end

但它没有工作.. 每当我插入测试时..得到这个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

帮帮我....

【问题讨论】:

    标签: c# sql sql-server database triggers


    【解决方案1】:
    • 当您应该从 INSERTED 中选择时,您正在从 test 中选择。您希望语句根据插入的内容生效,而不是根据表格可能包含的内容。

    • 即使在更改之后,每个语句都会触发一次触发器,而不是每行触发一次。如果插入影响多行,则 INSERTED 伪表将包含多行,因此子选择将失败。

    建议修订:

    create trigger trigger1 
    on test
    after insert
    as
    if EXISTS (select * from INSERTED where name like 'rakesh')
    begin 
        insert into trigg(age)
        select name from INSERTED 
        where name like 'rakesh'
    end
    

    【讨论】:

      【解决方案2】:

      没有看到您的触发器,我猜您错误地假设触发器中一次只处理一条记录,因此您尝试将一些标量变量设置为插入或删除的字段的值,如下所示:

      set @test = (select id from inserted)
      

      您必须在编写触发器时假设一次会处理多个记录。这是集合论而不是逐行处理。

      另一种可能性是您正在使用的操作查询中有一些子查询,并且它确实返回了多条记录。

      另一种可能性是 trigg 表上有一个写得很糟糕的查询,这就是导致您的错误的原因。

      【讨论】:

        【解决方案3】:

        这样的事情怎么样:

        CREATE TRIGGER trigger1
        ON test AFTER insert AS
        
        INSERT INTO trigg (age)
        SELECT name FROM INSERTED
        WHERE name like 'rakesh'
        

        我根据您提供的代码猜测您的表结构,但这应该更接近您的需要。

        【讨论】:

          猜你喜欢
          • 2018-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多