【问题标题】:How can I get the 'External name' of a SQL CLR trigger?如何获取 SQL CLR 触发器的“外部名称”?
【发布时间】:2010-09-21 19:13:43
【问题描述】:

我使用以下 SQL 创建了一个 SQL CLR 触发器:

GO
CREATE TRIGGER AuditAccountsTable
   ON [dbo].[Accounts]
   FOR INSERT,DELETE,UPDATE
AS 
EXTERNAL NAME namespace.Triggers.AuditTrigger

我正在尝试查询:

select * from sys.triggers

有没有办法在数据库中查询触发器上找到:EXTERNAL NAME namespace.Triggers.AuditTrigger

【问题讨论】:

    标签: sql sql-server triggers sqlclr


    【解决方案1】:

    我不能确定,因为我没有地方可以测试这个,但是下面返回的文本列是否让您接近您正在寻找的内容?

    select t.name, c.text
        from sys.triggers t
            inner join sys.syscomments c
                on t.object_id = c.id
        where t.type_desc = 'CLR_TRIGGER'
    

    【讨论】:

    • 这是我现在正在做的快速修复,但如果我有多个 CLR 触发器,我希望能够区分它们。
    • 我曾希望 sys.syscmets 表中的文本列包含您要查找的外部名称。
    • @JohnEgbert 和 Joe:sys.syscomments(以及 sys.sql_modules)不包含任何用于 SQLCLR T-SQL 包装器对象的 CREATE 语句。但是,您可以通过我的answer 中所示的简单查询来获取此信息。
    【解决方案2】:

    与存储过程和函数等 T-SQL“模块”不同,SQLCLR T-SQL 包装对象的CREATE 语句不存储在数据库中。这就是为什么您无法通过sys.sql_modulesOBJECT_DEFINITION 或已弃用的-since-SQL-Server-2005-and-should-not-be-used sys.syscomments 访问它们的原因。这就是为什么 SQLCLR 存储过程和函数需要将它们的参数默认值存储在sys.parameters

    相反,SQLCLR T-SQL 包装器对象的 CREATE 语句是从元数据中推断出来的,就像索引、主键、外键等一样。

    您可以从以下查询中获取CREATE TRIGGER 语句的所有部分:

    SELECT OBJECT_SCHEMA_NAME(st.[object_id]) AS [SchemaName],
           st.[name] AS [TriggerName],
           OBJECT_SCHEMA_NAME(st.parent_id) AS [ParentSchemaName],
           OBJECT_NAME(st.parent_id) AS [ParentName],
           st.is_instead_of_trigger,
           SUBSTRING((
             SELECT N', ' + ste.[type_desc]
             FROM   sys.trigger_events ste
             WHERE  ste.[object_id] = st.[object_id]
             FOR XML PATH ('')
           ), 3, 500) AS [Actions],
           QUOTENAME(sa.name) AS [AssemblyName],
           QUOTENAME(sam.assembly_class) AS [AssemblyClass],
           QUOTENAME(sam.assembly_method) AS [AssemblyMethod]
    FROM   sys.triggers st
    INNER JOIN  sys.assembly_modules sam
            ON  sam.[object_id] = st.[object_id]
    INNER JOIN  sys.assemblies sa
            ON  sa.[assembly_id] = sam.[assembly_id]
    WHERE  st.parent_class = 1; --- OBJECT_OR_COLUMN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多