在数据库级别的应用程序中,我在架构开票和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
答案 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
哪个逻辑更有效率,但它是否物理更高效是一个悬而未决的问题。如果它实际上更快,那肯定不会太多。