【问题标题】:Create trigger in stored procedure在存储过程中创建触发器
【发布时间】:2019-04-25 22:08:22
【问题描述】:

我正在尝试在存储过程中创建一个触发器,因为它会在删除表时被删除。

我收到错误,无法执行。

CREATE PROCEDURE EC5Trigger2
AS
  CREATE TRIGGER trVendorProductsPST
  ON VendorProducts
  FOR INSERT
  AS
  BEGIN
    SET NOCOUNT ON

    DECLARE  @SKU VARCHAR(64)
    SELECT @SKU = I.SKU FROM inserted AS I

    INSERT INTO ProductStockTransactions (SKU, stockingCode)
    VALUES (@SKU, 'A')
  END

  RETURN 0

【问题讨论】:

  • 为什么要多次创建触发器?我假设因为你是在一个程序中完成的
  • 您的触发器无论如何都已损坏,并且无法按预期用于多行插入。你应该摆脱对标量变量的赋值,直接从inserted插入到目标表
  • 你为什么不解决基本问题:I am trying to save trigger in SP as it will be removed when the table is dropped. 最简单的解决方案是将创建触发器保存在文件中。重新创建表后,只需执行创建触发器脚本
  • 您的触发器有 MAJOR 缺陷,您似乎认为它会被 每行调用一次 - 事实并非如此。触发器将每条语句触发一次,因此如果您的INSERT 导致此触发器触发插入 25 行,您将触发触发器一次和@987654325 @ 伪表将包含 25 行。您的代码将从Inserted 中选择这 25 行中的哪一行?它是不确定的,您将获得任意行,而您将忽略所有其他行。您需要重写触发器以考虑到这一点!
  • NO - 既不是游标也不是 while 循环 - 使用 适当的、基于集合的 方法 - 这是迄今为止最有效的方法跨度>

标签: sql-server stored-procedures triggers


【解决方案1】:

这是使用动态 SQL 在存储过程中创建触发器的方法,这是唯一的方法。

CREATE PROCEDURE EC5Trigger2
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @TriggerCode NVARCHAR(max);

  SET @TriggerCode = 'CREATE TRIGGER trVendorProductsPST
  ON VendorProducts
  FOR INSERT
  AS
  BEGIN
    SET NOCOUNT ON
    DECLARE @SKU VARCHAR(64)
    SELECT @SKU = I.SKU from INSERTED as I

    INSERT INTO ProductStockTransactions (SKU, stockingCode)
      VALUES (@SKU, ''A'')
  END';

  EXEC(@TriggerCode);

  RETURN 0;
END

【讨论】:

  • 只是好奇,同样的方法我可以从另一个过程创建一个过程
  • @IkemMichael 当然。
  • 我怎样才能做到这一点?和上面一样吗?
猜你喜欢
  • 2021-10-12
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多