【问题标题】:FOR INSERT trigger not firingFOR INSERT 触发器未触发
【发布时间】:2013-08-28 13:35:18
【问题描述】:

插入触发器有问题

这是我的触发代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create TRIGGER [dbo].[Vtriggers] ON [dbo].[stats]
FOR INSERT
AS
INSERT INTO [NewDB].dbo.NewStat (StatID)
SELECT ID
FROM inserted

奇怪的是,我构建了另一个表,就像我想在其中创建触发器的表一样,并且触发器适用于新表,但在旧表上它不起作用。 信息:在旧表中,我同时有多个插入。

这是我的两个表的架构:

旧的统计信息(触发器不起作用)

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[stats](
    [ID] [int] IDENTITY(1,1) NOT NULL,
      [Code] [nvarchar](100) NULL,
 CONSTRAINT [PK_Stat] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =    ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

和新的测试统计数据(该触发器对其起作用):

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Teststats](
    [ID] [int] IDENTITY(1,1) NOT NULL,
      [Code] [nvarchar](100) NULL,
 CONSTRAINT [PK_Teststats] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =    ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

这是我在另一个数据库上的目标表:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[NewStat](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StatID] [int] NULL,
) ON [PRIMARY]

GO

触发器在具有相同架构的测试表上工作得很好,但在创建触发器后用户无法再插入旧的 stat 表中!

【问题讨论】:

  • 在您的表中 NewStat 是仅 StatID 列?
  • @Pranav ,也没有 id 列,它的自动增量
  • 可能DISABLE TRIGGER 已被针对旧触发器调用? (试试ENABLE 看看是否有变化)

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


【解决方案1】:

你有错误的插入语句所以它不执行触发器。 正确的如下。

CREATE TRIGGER [dbo].[Vtriggers] ON [dbo].[stats]
FOR INSERT
AS
INSERT  INTO [NewDB].dbo.NewStat
        ( StatID )
VALUES  ( ID )

【讨论】:

  • 它在 ID 上给出错误“无效的列名 'ID'”。上面的语句适用于具有相同架构的新表。
【解决方案2】:

试试这个:-

create TRIGGER [dbo].[Vtriggers] ON [dbo].[stats]
FOR INSERT
AS
INSERT INTO [NewDB].dbo.NewStat (StatID) values(SELECT max(ID)
FROM inserted)

【讨论】:

  • 我已经这样做了,但仍然没有在两个表中插入,但是命令本身“INSERT INTO [NewDB].dbo.NewStat (StatID) values(SELECT max(ID) from [db].[ dbo].[stats])" 完美运行
  • 这意味着插入的表没有行...做一件事..从stats表中删除所有触发器..然后创建新触发器然后尝试..
  • 已经做到了,我总是删除最后一个创建另一个触发器。别的东西,插入的表中有很多行,我应该提到该语句也适用于 max 关键字,但它们都不能在触发器中工作。
  • 您采用了一个应该适用于多行插入的触发器,并将其替换为一个已损坏适用于多行插入的触发器。
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多