Как я могу получить «Внешнее имя» триггера SQL CLR? - PullRequest
2 голосов
/ 21 сентября 2010

Я создал триггер SQL CLR со следующим SQL:

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 ]

1 голос
/ 23 августа 2015

В отличие от «модулей» T-SQL, таких как хранимые процедуры и функции, у объектов-оболочек T-SQL SQLCLR нет своих операторов CREATE, хранящихся в базе данных. Вот почему вы не можете получить к ним доступ через sys.sql_modules , OBJECT_DEFINITION или устаревший, так как SQL-Server-2005-и-не-не-используемый sys.syscomments . Вот почему хранимым процедурам и функциям SQLCLR необходимо сохранять значения параметров по умолчанию в sys.parameters

Вместо этого CREATE операторы для объектов-оболочек T-SQL SQLCLR выводятся из метаданных, так же как индексы, первичные ключи, внешние ключи и т. Д.

Вы можете получить все части оператора 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
1 голос
/ 22 сентября 2010

Я не могу быть уверен, поскольку у меня нет места, чтобы проверить это, но приводит ли текстовый столбец, приведенный ниже, к тому, что вы ищете?

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'
...