为什么要为SQL Trigger指定必需的参数?

时间:2012-10-05 01:54:55

标签: c# sql sql-server triggers clr

在C#中为SQL Server 2008 Express创作INSERT触发器时:我发现需要以下SqlTrigger注释:

[SqlTrigger(Name = "SomeMethod", Target = TABLE_NAME, Event = "INSTEAD OF INSERT")]
public static void SomeMethod() { ... }

目标规范似乎是一个恼人的要求。我想让这个触发器可以在各种表上运行。无论如何都要避免指定Target或者在SQL创建期间覆盖它吗?

与此问题类似: SQL CLR Trigger - get Target / Table name 但我希望能够动态设置目标。

我探索这个的原因是,我有一些表现不佳的遗留代码。我希望能够在不关闭它的情况下诊断程序集触发器中可能存在的问题。理想情况下,劫持发往它的插入,进行一些诊断,然后传回原始程序集。我相信这个Target参数限制我这样做。

2 个答案:

答案 0 :(得分:1)

SqlTriggerAttribute控制针对特定表的触发器的注册。如果选择,则可以完全省略此属性,并手动执行注册。只要您进行注册through SQL,就可以为多个表引用相同的CLR触发器代码:

CREATE TRIGGER SomeMethod1 ON Table1 AFTER  INSERT AS 
EXTERNAL NAME Namespace.SomeMethod
GO
CREATE TRIGGER SomeMethod2 ON Table2 AFTER  INSERT AS 
EXTERNAL NAME Namespace.SomeMethod
当针对SomeMethodTable1执行插入时,将调用

Table2


然而,如果您的数据库包含多个具有足够相似结构的表,以至于对于所有这些表运行相同的触发器代码,这通常是一个不好的迹象。 Joe Celko曾经将此问题称为"Attribute Splitting"(特别是Table Splitting)。

答案 1 :(得分:0)

由于target是Attribute中的必填字段,因此您需要提供它,并且可以为其提供表名或数据库名称,但在运行时不能更改它。在max,你可以做的是停止执行触发器。

参考:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqltriggerattribute.target.aspx