2010-09-21 69 views
2

我创建了一个SQL CLR触发器与后续的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的触发从查询D B?

回答

0

我无法确定,因为我没有足够的空间来测试它,但下面的文本列是否会让您接近您要查找的内容?

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' 
+0

这就是我现在所做的是一个快速解决方案,但如果我有多个CLR触发器,我想能够区分它们。 – 2010-09-21 22:36:39

+0

我曾希望sys.syscomments表中的文本列将包含您正在查找的外部名称。 – 2010-09-22 00:44:42

+0

@JohnEgbert和Joe:'sys.syscomments'(以及'sys.sql_modules')不包含任何用于SQLCLR T-SQL包装器对象的CREATE语句。但是,你可以做一个简单的查询来获取这个信息,如我的[答案](http://stackoverflow.com/a/32171287/577765)所示。 – 2015-08-23 20:40:07

0

与T-SQL的“模块”,如存储过程和函数中,SQLCLR T-SQL包装对象没有存储在数据库中的CREATE语句。这就是为什么你不能通过sys.sql_modules,OBJECT_DEFINITION或自SQL-Server-2005以及不应该使用的sys.syscomments来访问它们的原因。这就是为什么SQLCLR存储过程和函数必须存储在sys.parameters

相反,CREATE报表SQLCLR T-SQL包装对象从元数据推断出它们的参数的默认值,就像索引,主键,外键,等

你可以得到所有的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