【问题标题】:SQL Update Trigger for writing entire row to another table用于将整行写入另一个表的 SQL 更新触发器
【发布时间】:2015-06-12 09:09:58
【问题描述】:

我昨天发布了一个问题,这是相关的。我有一张名为 People_Master 的表

CREATE TABLE [dbo].[People_Master](
[ID] [int] IDENTITY(900001,1) NOT NULL,
[Email] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[uac] [int] NULL,
[department] [nvarchar](50) NULL,
 CONSTRAINT [PK_People_Master] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)

我还创建了另一个名为 People_Delta 的表

CREATE TABLE [dbo].[People_Delta](
[ID] [int] NOT NULL,
[Email] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[uac] [int] NULL,
[Department] [nvarchar](50) NULL,
[change_type] [nvarchar](10) NULL
) ON [PRIMARY]

请注意,我在 People_Delta 中多了一个名为“change_type”的列

现在我正在尝试为 People_Master 编写一个更新触发器,这样当它发生更新时,它应该将整行写入 People_Delta 并将 change_type 设置为“Modify”。

这是我写的触发器(我不擅长 SQL。哈哈!)

CREATE TRIGGER [dbo].[TR_Update] 
   ON  [dbo].[People_Master]
   AFTER Update
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    Declare @RowCount int
    Declare @ID int

    --Create a temp table to hold the inserted data.
    Declare @TempTable As Table
    (
        [ID] [int],
        [Email] [nvarchar](50) ,
        [FirstName] [nvarchar](50),
        [uac] [int] ,
        [department] [nvarchar](50)     
    )

    Insert Into @TempTable (ID,Email,FirstName,uac,department)
    select 
        ID,
        Email,
        FirstName,
        uac,
        department
    from
        inserted    


    select @ID = ID from inserted

    --check if the row for this ID doesnt exist already.
    Select @RowCount=COUNT(*) from People_Delta where People_Delta.ID = @ID and People_Delta.change_type = 'Modify';

    if(@RowCount = 0)
    Begin
        Insert into People_Delta (ID,Email,FirstName,uac,Department,change_type)
        values (@TempTable.ID,@TempTable.Email,@TempTable.FirstName,@TempTable.uac,@TempTable.department,'Modify');
    END

END

GO

但是,当我执行此触发器时,我收到以下错误:

Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".
Msg 137, Level 16, State 1, Procedure TR_Update, Line 50
Must declare the scalar variable "@TempTable".

我做错了什么?请帮忙! GT。

【问题讨论】:

  • 也可能根据我的要求,有没有更好的方法来完成这个?在我看来,上面的问题是,如果我说必须更改我的表设计,例如添加一个新列,我将不得不更改我的触发器定义以将该列也包含在 People_Delta 的更新中。
  • 如果您想为您的问题添加更多内容,您可以edit它。您永远不需要直接对自己的问题(或答案)添加评论
  • 也许这会有所帮助? stackoverflow.com/questions/20265023/…

标签: sql-server tsql triggers


【解决方案1】:

试试这个触发器。

更改了这个插入查询

 Insert into People_Delta (ID,Email,FirstName,uac,Department,change_type)
        values (@TempTable.ID,@TempTable.Email,@TempTable.FirstName,@TempTable.uac,
                @TempTable.department,'Modify');

Insert into People_Delta (ID,Email,FirstName,uac,Department,change_type)
        select  ID, Email,FirstName, uac, department, 'Modify'    from
        inserted  

更新的触发器:

CREATE TRIGGER [dbo].[TR_Update] 
   ON  [dbo].[People_Master]
   AFTER Update
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    Declare @ID int

    select @ID = ID from inserted

    If NOT EXISTS(Select People_Delta.ID from People_Delta where People_Delta.ID = @ID 
                       and People_Delta.change_type = 'Modify')
    BEGIN
         Insert into People_Delta (ID,Email,FirstName,uac,Department,change_type)
          select  ID, Email,FirstName, uac, department, 'Modify'    from
          inserted  
    END
END

【讨论】:

  • 为什么要在触发器中使用@TempTable 表??
  • @Mukesh Kalgude:不需要。我删除了。
  • 即使不需要'select *',在需要检查是否存在时总是使用'​​Select 1'。我们为什么要强制获取所有列。
  • @Kumar - 感谢您回答我的问题。成功了!
  • select @ID = ID from inserted 仍然是错误的,因为inserted 是一个可能有很多行的表
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2011-01-15
  • 2015-12-28
  • 1970-01-01
  • 2022-01-15
  • 2022-01-21
相关资源
最近更新 更多