【发布时间】:2012-09-19 16:55:31
【问题描述】:
在我们的数据库级应用程序中,我在 Billing 和 Billing_History 架构中有一个名为 Installments 的表。
显示的触发器位于计费模式的分期付款表中。
每次在计费模式中插入/更新记录时,它也会写入历史文件。
如果记录从计费表中删除,则将其写入历史记录表,并带有“已删除”指示符 = 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
结束
【问题讨论】:
-
建议您为正在使用的 RDBMS 添加标签。
-
If Not Exists (Select * From Inserted)不会影响您的性能,但您可以将其替换为IF @@ROWCOUNT > 0检查相同的语义。 -
在插入中选择 * 是一种极差的做法。
-
建议用大锤子破坏扳机并使用存储的触发。
-
@HABO -
getdate()是一个runtime constant,所以这里的每个语句只会被评估一次,因为在这种情况下两个代码分支是互斥的,我看不到这个问题。
标签: sql sql-server triggers