【问题标题】:Can I pass arguments to an external (CLR) SQL Server trigger?我可以将参数传递给外部 (CLR) SQL Server 触发器吗?
【发布时间】:2009-07-14 22:22:46
【问题描述】:

我在 SQL Server 中有一个触发器,但我需要将参数传递给 CLR 代码,即触发器上下文中未提供的信息。

这样的事情可能吗?

CREATE TRIGGER MyTrigger ON MyTable FOR INSERT
AS EXTERNAL NAME MyAssembly.MyNamespace.MyTriggerHandler("Foo", "Bar")

当然,这些参数是静态的。

参数排列的数量是离散的,但是在 CLR 程序集中为每个排列创建一个单独的类或函数会很笨拙,并且每次需要另一个触发器时都需要一个我想避免的编译/部署步骤。

【问题讨论】:

    标签: sql-server sql-server-2005 triggers sqlclr


    【解决方案1】:

    经过一番研究,看来我想做的事,做不到。

    使用触发器“外部名称”子句传递的方法必须是无参数的,并且不能在CREATE TRIGGER语句中修改SqlTriggerContext。

    我最终选择了置换路线,并且支持的参数变体更少。或许 .NET 集成下次会更加强大。

    【讨论】:

    • 您也不能将参数传递给普通触发器。为什么需要 SQLCLR 触发器上的参数? INSERTED、DELETED 表可用于在 SQLCLR 触发器中进行查询,就像它们在普通触发器中一样
    【解决方案2】:

    从某种意义上说,您可以将信息传递给触发器(无论是 T-SQL 还是 SQLCLR),而不是像您在问题中显示的那样直接传递信息。不过,您有 2 或 3 个选项可以将不属于 DML 操作本身的信息传递给事件链中的任何触发器:

    1. 本地临时表
    2. SET CONTEXT_INFO / CONTEXT_INFO
    3. 在 SQL Server 2016 或更高版本上:sp_set_session_context / SESSION_CONTEXT

    在所有情况下,您都可以通过执行 SqlCommand(使用 "Context Connection = true;" 作为连接字符串)和输出 SqlParameter 将值拉入 .NET 代码来获取值。

    【讨论】:

      【解决方案3】:

      是的,您可以为此使用 sp_OA 程序:http://msdn.microsoft.com/en-us/library/aa238863(SQL.80).aspx

      【讨论】:

      • 这是用来创建OLE对象的,与基于CLR的外部触发代码无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2016-05-26
      • 2013-01-05
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多