【问题标题】:SQL Server Update Trigger (Not Unique Insert Issue)SQL Server 更新触发器(非唯一插入问题)
【发布时间】:2011-02-13 04:16:45
【问题描述】:

我有一个超级简单的表格,看起来像这样:

CREATE TABLE [dbo].[TestTable](
[SomeColumn] [int] NOT NULL )

我在另一个表上也有一个超级简单的触发器,看起来像这样:

ALTER TRIGGER [dbo].[trg_Audit_TableXYZ] ON [dbo].[TableXYZ] AFTER UPDATE

AS

INSERT INTO [dbo].[TestTable] Values (123)

我的问题是当触发器运行时出现以下错误:

更新或删除的行值要么不会使行唯一,要么会改变多行(2 行)。

我不明白,为什么会出现这个错误?

谢谢。

【问题讨论】:

  • 触发器真的包含值 '123' 吗?
  • 是的,我只是将值硬编码为 123,以使触发器尽可能简单。当我运行触发器时,我确保“TestTable”的行数为零,并且我只更新具有触发器的表上的单个单元格。即使我删除了主键约束,我仍然会遇到同样的错误(刚刚尝试过,我会更新帖子)。
  • 您是否使用 MSSMS 编辑 TableXYZ 中的行?类似的问题在这里stackoverflow.com/questions/901931/…。使用 MSSMS 编辑时出现重复行的问题,但在代码中完成更新时工作得很好。您需要TableXYZ 中的主键。

标签: sql-server triggers


【解决方案1】:

SET NOCOUNT ON 添加到触发器定义的顶部。这将抑制从触发器发出并混淆 SSMS 的额外行受影响的消息。

ALTER TRIGGER [dbo].[trg_Audit_TableXYZ] 
ON [dbo].[TableXYZ] 
AFTER UPDATE
AS
SET NOCOUNT ON
--Rest of trigger definition follows
INSERT INTO [dbo].[TestTable] Values (123)

【讨论】:

    【解决方案2】:

    我无法重新创建。这可能与其他触发器或约束或其他东西冲突吗?我不知道。

    更新:

    正如 Mikael 所说,在 TableXYZ 中添加主键将解决该问题。仅当您使用 SSMS 修改表时才会发生。谢谢米凯尔。这有效:

    create database testdb
    go
    use testdb
    
    CREATE TABLE [dbo].[TestTable](
    [SomeColumn] [int] NOT NULL)
    
    CREATE TABLE [dbo].[TableXYZ](
    [ID] [int] identity(1,1) primary key,
    [SomeColumn] [int] NOT NULL )
    go
    
    create TRIGGER [dbo].[trg_Audit_TableXYZ] ON [dbo].[TableXYZ] AFTER UPDATE
    AS
    INSERT INTO [dbo].[TestTable] Values (123)
    go
    
    INSERT INTO [dbo].[Tablexyz] Values (4)
    INSERT INTO [dbo].[Tablexyz] Values (5)
    INSERT INTO [dbo].[Tablexyz] Values (6)
    
    update tablexyz set somecolumn = 789
    update tablexyz set somecolumn = 0
    

    【讨论】:

    • 尝试使用 SSMS 进行编辑,而不是在代码中调用 update。右击表格Tablexyz - 选择Edit Top 200 Rows - 更改一行的值。
    • 哦,我明白了。那真不幸。这不能是预期的行为。我会更新我的帖子。
    • 我实际上在 SSMS 和代码上遇到了同样的错误,但有一个例外。我原始帖子中的示例在 SSMS 上失败,但适用于代码,但如果我在插入上使用子查询,如“INSERT INTO [dbo].[TestTable] Select 123 Union All Select 456”,那么它在 SSMS 和代码上都失败了.添加“SET NOCOUNT ON”语句解决了所有问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    相关资源
    最近更新 更多