【问题标题】:How to debug an insert/update trigger to see values inserted/updated如何调试插入/更新触发器以查看插入/更新的值
【发布时间】:2012-02-01 15:54:43
【问题描述】:

我正在尝试调试这个触发器。我需要知道它试图插入的值。下面的 Print @Item 不起作用。

DECLARE @Item VARCHAR(MAX);



  INSERT INTO [BPRIL DATA ENTRY]
              ([COMPANY],
               [CUSTOMER],
               [ITEM #],
               [VENDOR],
               [SEASON],
               [BPRILP0CaseCost],
               [CustomerItem#])
  SELECT DISTINCT oh.company,
         oh.customer,
         @Item = ins.itemnumber,
         ins.vendor,
         oh.season,
         ins.VendorCost,
         oid.[CustomerSKU]
  FROM   [ORDER HEADER] AS oh
         LEFT JOIN [Order Item Detail] AS OID
           ON oh.[ORDER #] = OID.[ORDER #]
         LEFT JOIN [INSERTED] AS ins
           ON ins.[ITEM #] = OID.[ITEM #]
         LEFT JOIN [BPRIL DATA ENTRY] bp
           ON bp.[COMPANY] = oh.company
              AND bp.[CUSTOMER] = oh.customer
              AND bp.[ITEM #] = ins.itemnumber
              AND bp.[VENDOR] = ins.vendor
              AND bp.[SEASON] = oh.season
  WHERE  bp.[COMPANY] IS NULL
         AND bp.[CUSTOMER] IS NULL
         AND bp.[ITEM #] IS NULL
         AND bp.[VENDOR] IS NULL
         AND bp.[SEASON] IS NULL
         AND (OID.[STATUS] = 'C'
         OR OID.[STATUS] = 'I')
         AND ins.[VENDOR] IS NOT NULL
         AND ins.[QUOTE #] IS NOT NULL
         AND ins.[VENDORCOST] IS NOT NULL 

Print @Item;

【问题讨论】:

  • 不能从表[BPRIL DATA ENTRY]中选择不出来吗?为什么是@Item 变量? ins.itemnumber 将在表中 [BPRIL DATA ENTRY]
  • @Item 是我想查看的变量,所以这就是我创建该变量的原因...用于调试目的。

标签: sql-server tsql triggers


【解决方案1】:

@cadrell0 是正确的,您不应该在插入语句中对变量进行设置。您也不应该对触发器中的标量变量进行任何设置。插入和删除的表可能有不止一行,因此有多个值。您需要考虑触发器的集合

但是,这是我开发触发器并查看正在发生的事情的过程。

首先,我找出触发器之外的代码(在开发人员中,这可能意味着在您解决重大更改时删除现有触发器)。

所以我在脚本中将插入和/或删除的表设置并填充为临时表(Iscript 出实际表并更改名称以使其更容易)。我确保用多条记录(非常重要!)和满足我的测试用例的数据填充它们。

然后我编写代码(减去创建触发器部分)并在我将使用插入或删除的任何地方使用#inserted 和/或#deleted 临时表。现在我可以一次运行一个部分,并在需要时查看我的结果。我还可以将所有内容放在一个事务中并在最后回滚,这样我就可以继续重复使用相同的测试数据,直到我做对了。

一旦我知道我的代码执行了我希望它执行的操作,我就会删除事务、临时表代码和任何测试代码,并在全局范围内将 # 符号替换为空(因此仅限触发器的表现在称为插入和/或删除)。然后我添加创建触发器代码并创建触发器。

【讨论】:

    【解决方案2】:

    我创建了一个表:

    CREATE TABLE DebugTrace
    (
       [COMPANY] NVARCHAR(2),
       [CUSTOMER] NVARCHAR(255),
       [ITEM #] NVARCHAR(35),
       [VENDOR] NVARCHAR(50),
       [SEASON] INT,
       [BPRILP0CaseCost] MONEY,
       [CustomerItem#] NVARCHAR(50)
    )
    

    然后我运行触发器插入到 DebugTrace 而不是 [BPRIL DATA ENTRY]

    【讨论】:

      【解决方案3】:

      您不能同时设置变量和插入表格。您需要在两个单独的查询中执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        相关资源
        最近更新 更多