1

在 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 参数限制了我这样做。

4

2 回答 2

1

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

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

SomeMethod然后将在对Table1或执行插入时调用Table2


综上所述,但是,如果您的数据库包含多个具有足够相似结构的表,以至于对所有这些表运行相同的触发器代码甚至是有意义的,这通常是一个不好的迹象。Joe Celko 曾经将此问题称为“属性拆分”(特别是表拆分)。

于 2012-10-05T06:18:31.540 回答
0

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

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

于 2012-10-05T03:28:34.980 回答