我使用以下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
?
答案 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_modules,OBJECT_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