我在 Access 中有一个表单,其中包含 SQL Server 中的链接表,称为 Outage Summary。有几个子表单,但只有一个称为“中断详细信息”的子表单值得关注。表单和子表单由一个名为 的属性链接OutageSummaryID
。每个停机摘要可以有多个停机详细信息,并且每个停机详细信息记录都有一个唯一的OutageDetailID
.
我对 SQL Server 中的每个表都有一个触发器,该触发器记录每个执行INSERT
的 、UPDATE
或DELETE
,并将它们与执行操作的时间和用户的日期时间一起添加到审计表中。
每当您编辑和更新任何中断摘要或添加和中断详细信息时,“中断详细信息审计”表中都会填充一条记录,其中每条记录都OutageDetailID
表示该记录已同时更新。我不相信 Access 实际上会更新表中的每条记录。也许我的触发器有问题(尽管所有其他触发器的编写方式和功能都与预期相同)或者我正在做的事情存在根本性的缺陷。我怎样才能解决这个问题?
我的触发器:
USE [OutageDev]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_audOutageDetails]
ON [dbo].[Outage Details SubTbl]
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
IF EXISTS (SELECT TOP 1 * FROM Inserted) AND EXISTS (SELECT TOP 1 * FROM Deleted)
INSERT INTO dbo.[Outage Details Audit] (OutageSummaryID, [TimeOut], /* ... */ OutageDetailID, AuditDateTime, AuditUser, AuditAction)
SELECT i.OutageSummaryID, i.[TimeOut], /* ... */ i.OutageDetailID, GETDATE(), SUSER_SNAME(), 'UPDATE'
FROM inserted i join deleted d on i.OutageDetailID = d.OutageDetailID
IF EXISTS (SELECT TOP 1 * FROM Inserted) AND NOT EXISTS (SELECT TOP 1 * FROM Deleted)
INSERT INTO dbo.[Outage Details Audit] (OutageSummaryID, [TimeOut], /* ... */ OutageDetailID, AuditDateTime, AuditUser, AuditAction)
SELECT OutageSummaryID, [TimeOut], /* ... */ OutageDetailID, GETDATE(), SUSER_SNAME(), 'INSERT'
FROM inserted
IF NOT EXISTS (SELECT TOP 1 * FROM Inserted) AND EXISTS (SELECT TOP 1 * FROM Deleted)
INSERT INTO dbo.[Outage Details Audit] (OutageSummaryID, [TimeOut], /* ... */ OutageDetailID, AuditDateTime, AuditUser, AuditAction)
SELECT OutageSummaryID, [TimeOut], /* ... */ OutageDetailID, GETDATE(), SUSER_SNAME(), 'DELETE'
FROM deleted
END
在 UPDATE 触发器上添加连接之前,我遇到了同样的问题,我只是将它添加到......我想进一步说服自己,行实际上正在被删除和插入。无论有没有连接,它的功能都相同。