0

我在 Access 中有一个表单,其中包含 SQL Server 中的链接表,称为 Outage Summary。有几个子表单,但只有一个称为“中断详细信息”的子表单值得关注。表单和子表单由一个名为 的属性链接OutageSummaryID。每个停机摘要可以有多个停机详细信息,并且每个停机详细信息记录都有一个唯一的OutageDetailID.

我对 SQL Server 中的每个表都有一个触发器,该触发器记录每个执行INSERT的 、UPDATEDELETE,并将它们与执行操作的时间和用户的日期时间一起添加到审计表中。

每当您编辑和更新任何中断摘要或添加和中断详细信息时,“中断详细信息审计”表中都会填充一条记录,其中每条记录都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 触发器上添加连接之前,我遇到了同样的问题,我只是将它添加到......我想进一步说服自己,行实际上正在被删除和插入。无论有没有连接,它的功能都相同。

4

0 回答 0