2010-09-21 11 views
2

J'ai créé un déclencheur CLR SQL avec le suivi SQL:Comment puis-je obtenir le 'nom externe' d'un déclencheur CLR SQL?

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

Je suis en train d'interroger:

select * from sys.triggers 

est-il un moyen de trouver le: EXTERNAL NAME namespace.Triggers.AuditTrigger sur la gâchette de l'interrogation dans la DB?

Répondre

0

Je ne peux pas être sûr car je n'ai pas d'endroit pour tester ceci, mais est-ce que la colonne de texte retournée ci-dessous vous rapproche de ce que vous cherchez?

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

C'est ce que je fais maintenant comme une solution rapide, mais si j'ai plusieurs déclencheurs CLR, je veux être capable de les différencier. –

+0

J'avais espéré que la colonne de texte de la table de sys.syscomments contiendrait le nom externe que vous cherchiez. –

+0

@JohnEgbert et Joe: 'sys.syscomments' (de même que' sys.sql_modules') ne contient aucune instruction 'CREATE' pour les objets encapsuleurs T-SQL SQLCLR. Cependant, vous pouvez faire une requête simple pour obtenir cette information comme indiqué dans ma [réponse] (http://stackoverflow.com/a/32171287/577765). –

0

Contrairement à T-SQL "modules" tels que les procédures stockées et fonctions, les objets wrapper T-SQL SQLCLR ne disposent pas de leurs déclarations CREATE stockées dans la base de données. C'est pourquoi vous ne pouvez pas y accéder via sys.sql_modules, OBJECT_DEFINITION, ou le obsolète-depuis-SQL-Server-2005-and-should-not-be-used sys.syscomments. C'est pourquoi SQLCLR Procédures stockées et fonctions doivent avoir leurs paramètres valeurs par défaut stockées dans sys.parameters

Au lieu de cela, CREATE déclarations pour les objets wrapper T-SQL SQLCLR sont déduites de méta-données, comme index, clés primaires, clés étrangères, etc.

Vous pouvez obtenir toutes les parties de la déclaration CREATE TRIGGER de la requête suivante:

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