删除触发器并从另一个表中获取字段
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
【讨论】:
以上是关于删除触发器并从另一个表中获取字段的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:使用带有 WHERE 子句的 JOINS 从一个表中获取所有记录并从另一个表中获取可用记录