【问题标题】:why this trigger always loop?为什么这个触发器总是循环?
【发布时间】:2013-05-10 14:37:55
【问题描述】:

我尝试使用触发器,当我在表 penduduk 中插入时,然后在表 muda 中也会插入,实际上这个触发器是工作的,但是这个触发器变成循环,当我在 penduduk 中插入 (123) 时,然后再次插入 (1234 ) 那么结果将是 (123,1234,123,1234) ,我可以使用“From penduduk”吗?还是我应该使用“从插入”?因为当我使用 FROM 插入时没有结果 我的查询是这样的

CREATE TRIGGER auto_muda
ON penduduk
FOR INSERT
AS
INSERT INTO muda (noktp,tgl_lahir)
SELECT noktp, tgl_lahir FROM penduduk
WHERE umur < 27

【问题讨论】:

  • 你应该和一个条件,所以只添加之前没有插入的记录。
  • 这意味着哪里像这样? muda.primary = penduduk.primary 在哪里?

标签: sql-server triggers sql-server-2008-r2


【解决方案1】:

您目前正在从penduduk 而非inserted 逻辑表中获取所有匹配的行。您可以将触发器更改为以下内容:

CREATE TRIGGER auto_muda
ON penduduk
FOR INSERT
AS
INSERT INTO muda (noktp,tgl_lahir)
SELECT noktp, tgl_lahir FROM inserted -- Use inserted, not the base table
WHERE umur < 27

来自MSDN

DML 触发器使用删除和插入的逻辑(概念)表。它们在结构上类似于定义触发器的表,即尝试用户操作的表。删除和插入的表保存了可能被用户操作更改的行的旧值或新值。

【讨论】:

  • 当我使用插入时没有结果
  • 没有WHERE umur &lt; 27会有结果吗?如果可能,请分享您的插入语句和值。
【解决方案2】:

使用

Select noktb, tgl_lahir from inserted

如果您有兴趣根据新插入的数据进行插入。您的选择似乎能够按原样返回许多项目,这解释了“循环”/重复。

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多