2010-09-21 70 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