【问题标题】:My first sql trigger in sql server 2008我在 sql server 2008 中的第一个 sql 触发器
【发布时间】:2011-11-28 15:00:38
【问题描述】:

当我遇到一个奇怪的错误时,我尝试执行以下代码。 我希望你们能在这里帮助我:)

CREATE TRIGGER Vlucht_Duurtussenstop
   ON  dbo.Vlucht
   AFTER UPDATE,INSERT
AS 
BEGIN
 IF (new.Duurtussenstop <> old.Duurtussenstop)
    BEGIN
      EXECUTE dbo.testprocudure1
         @p_vluchtDuurtussenstop = Duurtussenstop
    END
END
GO

给予

[15:50:03] Gert-Jan Bos: Msg 102, Level 15, State 1, Line 7
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near ' '.

【问题讨论】:

    标签: sql triggers using


    【解决方案1】:

    SQL Server 没有newold。它有inserteddeleted 伪表,但如果原始语句影响多行,它们可能包含多行。

    根据您的使用情况,还不清楚 testprocudure1 是使用旧值还是新值调用,因此我目前无法重写您的查询。


    理想情况下,testprocudure1 的主体可以在触发器中展开,以避免使用游标 - 但要找到您感兴趣的行,查询类似于:

    SELECT i.Duurtussenstop,d.Duurtussenstop
    FROM
        inserted i
            join
        deleted d
            on
                 i.Col1 = d.Col1 and
                 i.Col2 = d.Col2
    

    我假设表上的主键是 (Col1,Col2)

    【讨论】:

    • 太棒了!感谢您的回复,但是,我的老师给了我这个示例代码: CREATE TRIGGER Toetjes.T_Ingredient ON Toetjes.Ingredient AFTER INSERT,DELETE,UPDATE AS BEGIN IF (OLD.hoeveelheidPP NEW.hoeveelheidPP) BEGIN EXECUTE dbo.UpdateGerechtEnergie @p_gerechtnaam= gerechtnaam END END 我必须告诉他他错了吗?还是我必须替换旧的新语句?
    • 如果您使用 SQL Server,newold 肯定是错误的。我认为我在其他数据库(可能是 MySQL,或者 Oracle?)中看到过这样的事情。
    • 好吧,问题是,例如,当我使用更新查询时,我希望在 Duurtussenstop 的新值大于旧值时触发触发器,你能从中进行查询吗?提前谢谢:)
    • 谢谢!我刚刚注意到你写的内容在我的 powerpoint 的下一页......无论如何谢谢!
    【解决方案2】:

    在触发器中调用 proc 是一种不好的做法。如果它是一个需要一次运行一条记录的过程,那就特别糟糕了。 SQL 服务器触发器作用于一批记录,而不是一次一个。假设有人更新了 100,000 条记录?那么触发器会发生什么?您计划编写它的方式,那么只有一条记录会影响结果并运行 proc。您可以将它放在游标或 while 循环中,但这会降低性能。或者您可以放弃 proc 并使用基于集合的解决方案。

    您必须针对这些类型的更改进行计划并对其进行测试。您需要在触发器中具有基于集合而不是记录循环的过程,因为触发器中的缓慢可能会使整个系统停止。性能至关重要。我曾经不得不在遗留数据库中修复这样的 curosr。插入 40,000 条记录需要 40 多分钟(我有一个要导入的文件,该文件将插入数百万条记录)。在重写为基于集合的插入后,同样的 40,000 条记录只需要几秒钟即可处理。

    在编写 triiger 时,您需要测试单个记录插入和更新以及多个记录插入和更新,即使您认为它们永远不会发生。因为迟早它们会(例如,没有人会使用 GUI 一次更改 10,000 条记录的价格),并且您的触发器将使生产系统停止,而处理插入或更新。或者,它不会正确处理所有记录,而只会处理一个会导致数据完整性问题的记录。

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多