如何获取SQL CLR触发器的“外部名称”?

时间:2010-09-21 19:13:44

标签: sql sql-server triggers sqlclr

我使用以下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

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

与T-SQL"模块"不同。例如存储过程和函数,SQLCLR T-SQL包装器对象没有将CREATE语句存储在数据库中。这就是您无法通过sys.sql_modulesOBJECT_DEFINITION或不推荐使用的SQL-Server-2005以及不应该使用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
相关问题