删除触发器并从另一个表中获取字段

Posted

技术标签:

【中文标题】删除触发器并从另一个表中获取字段【英文标题】:Delete trigger and getting field from another table 【发布时间】:2017-01-06 15:36:14 【问题描述】:

我在 SQL 数据库上有这个删除触发器。记录当前删除并写入审计表。我被要求在这个历史表中包含另一个表中的一个字段,该字段与基于 SurveyID 删除的记录相关。我以为我可以做类似的事情

select @Status = Status from table where Survey = deleted.Survey

但这是不正确的语法。

ALTER trigger [dbo].[table_Selfdelete]
on [dbo].[table]

after delete
as
Begin
Set nocount on;

Declare @SurveyId int
Declare @StudentUIC varchar(10)
Declare @Status varchar(10)

select @SurveyId = deleted.SurveyID,
        @StudentUIC = deleted.StudentUIC
from deleted

select @Status = Status from tbly when SurveyID = deleted.SurveyID

insert into fupSurveyAudit
    values(@SurveyId,@StudentUIC,@Status)


End    

【问题讨论】:

如果删除多行怎么办? 到目前为止发布的三个答案并没有强调 DVT 所暗示的重点(但他们都解决了这个问题)。每个 statement 触发一次触发器,因此 deleted 可以包含 0、1 或 多个 行。将 deleted 中的值分配给标量变量,就像您在此处所做的那样,始终是一个错误,因为它忽略那些其他行。 【参考方案1】:

啊。我认为您希望在您的触发器中使用此 insert(仅此而已):

insert into fupSurveyAudit(SurveyId, StudentUIC, status)
    select d.SurveyId, d.StudentUIC, y.status
    from deleted d left join
         tbly y
         on d.SurveyId = y.SurveyId;

注意事项:

deleted 可能包含不止一行,因此假设它只有一行可能会导致运行时错误或不正确的结果。 需要left join,以防状态没有匹配行。 您应该始终在insert 中包含列 您的存档表应该有额外的列,例如标识列和插入的日期,它们是自动设置的(因此不是插入的明确部分)。

【讨论】:

【参考方案2】:

每个语句(删除、插入、更新)触发一次触发器,而不是语句中的每一行。

您不能在此处使用变量,因为当从表中删除多行时,审计表中只会插入一行,因为变量只能保存一个值。

你只需要从已删除的表中简单地插入到审计表中,就像这样......

ALTER trigger [dbo].[table_Selfdelete]
on [dbo].[table]

after delete
as
Begin
Set nocount on;

insert into fupSurveyAudit(SurveyId, StudentUIC,[Status])
select  d.SurveyID
       ,d.StudentUIC
       ,y.[Status]
from deleted d
INNER JOIN tbly y ON y.SurveyID = deleted.SurveyID

End  

【讨论】:

【参考方案3】:

试试这个

ALTER trigger [dbo].[table_Selfdelete]
on [dbo].[table]

after delete
as
Begin
Set nocount on;

insert into fupSurveyAudit  -- Better listed the column list here
select
    d.SurveyID, d.StudentUIC, y.Status
from
    deleted d JOIN tbly y ON d.SurveyID = y.SurveyID

End    

【讨论】:

以上是关于删除触发器并从另一个表中获取字段的主要内容,如果未能解决你的问题,请参考以下文章

从另一个表中查找触发

插入触发器 SQL。插入新表后如何从另一个表中检索值

MySQL:使用带有 WHERE 子句的 JOINS 从一个表中获取所有记录并从另一个表中获取可用记录

从一个表中选择 id 并从另一个表中选择它的值进行搜索

想写一个DB2触发器,几张表有关联,修改其中一张主表中的某一个字段,其他关联表中的该字段也跟着联动修改

SQL Server 删除触发器 - 引用已删除行或标记为删除的行的行句柄