SQL插入/更新/删除触发器效率

时间:2012-09-27 20:10:24

标签: sql sql-server triggers

在数据库级别的应用程序中,我在架构开票和Billing_History中有一个名为“分期付款”的表。

显示的触发器位于“结算架构”的“分期付款”表中。

这样做是每次在结算模式中插入/更新记录时,它也会写入历史文件。

如果记录从记帐表中删除,则会将其写入历史记录表,其中“已删除”指示符= true。

我认为“如果不存在(选择*来自已插入)会因为添加更多记录而终止我的表现。”

编写此触发器是否更有效?

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History]
ON [Billing].[Installments]
AFTER INSERT, DELETE, UPDATE
AS BEGIN
Insert Into Billing_History.Installments
    Select *, GetDate(), 0 From Inserted

If Not Exists (Select * From Inserted)
    Insert Into Billing_History.Installments
        Select *, GetDate(), 1 From Deleted

SET NOCOUNT ON;

-- Insert statements for trigger here

END

3 个答案:

答案 0 :(得分:1)

我建议你的触发形式是表现最好的,因为它是必需的任务。实际上没有更好的方法来实现相同的审计结果。

这里的答案将同意Creating audit triggers in SQL Server,这里是关于审计解决方案绩效的long discussion

您的情况略有不同,因为您实际上不希望在UPDATE情况下删除(原始)表,因此IF。

答案 1 :(得分:0)

为INSERT和UPDATE创建一个触发器,为DELETE创建第二个触发器。然后,您不必使用IF语句和慢查询来检查记录位置。

从设计角度来看,看看你是否可以消除触发器。他们很乱。

答案 2 :(得分:0)

嗯,你可以做出这个简单的改变:

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History]
ON [Billing].[Installments]
AFTER INSERT, DELETE, UPDATE
AS BEGIN

If Not Exists (Select * From Inserted)
    Insert Into Billing_History.Installments
        Select *, GetDate(), 1 From Deleted
ELSE
    Insert Into Billing_History.Installments
        Select *, GetDate(), 0 From Inserted

SET NOCOUNT ON;

-- Insert statements for trigger here

哪个逻辑更有效率,但它是否物理更高效是一个悬而未决的问题。如果它实际上更快,那肯定不会太多。