我通过这个简单的查询在SQL Server 2008 express上检索触发器:
SELECT
[so].[name] AS [trigger_name],
USER_NAME([so].[uid]) AS [trigger_owner],
USER_NAME([so2].[uid]) AS [table_schema],
OBJECT_NAME([so].[parent_obj]) AS [table_name],
OBJECTPROPERTY( [so].[id], 'ExecIsUpdateTrigger') AS [isupdate],
OBJECTPROPERTY( [so].[id], 'ExecIsDeleteTrigger') AS [isdelete],
OBJECTPROPERTY( [so].[id], 'ExecIsInsertTrigger') AS [isinsert],
OBJECTPROPERTY( [so].[id], 'ExecIsAfterTrigger') AS [isafter],
OBJECTPROPERTY( [so].[id], 'ExecIsInsteadOfTrigger') AS [isinsteadof],
OBJECTPROPERTY([so].[id], 'ExecIsTriggerDisabled') AS [disabled]
FROM sysobjects AS [so]
INNER JOIN sysobjects AS so2 ON so.parent_obj = so2.Id
WHERE [so].[type] = 'TR'
everthing似乎有效,但table_schema是错误的。
它总是返回NT AUTHORITY\NETWORK SERVICE
,而它应该返回SalesLT
我测试过的数据库是来自microsoft的示例数据库:AdventureWorks。
为什么会这样,我怎样才能为我的触发器获取正确的table_schema?
也许有更好的方法从sql server获取触发器? (必须使用尽可能多的SQL Server版本)
答案 0 :(得分:1)
不推荐使用sysobjects目录视图。使用sys.objects intead。请注意,所有者和模式是不同的东西。见下面的例子。
SELECT
[so].[name] AS [trigger_name],
USER_NAME(OBJECTPROPERTY([so].[object_id], 'OwnerId')) AS [trigger_owner],
OBJECT_SCHEMA_NAME([so2].[object_id]) AS [table_schema],
OBJECT_NAME([so].[parent_object_id]) AS [table_name],
OBJECTPROPERTY( [so].[object_id], 'ExecIsUpdateTrigger') AS [isupdate],
OBJECTPROPERTY( [so].[object_id], 'ExecIsDeleteTrigger') AS [isdelete],
OBJECTPROPERTY( [so].[object_id], 'ExecIsInsertTrigger') AS [isinsert],
OBJECTPROPERTY( [so].[object_id], 'ExecIsAfterTrigger') AS [isafter],
OBJECTPROPERTY( [so].[object_id], 'ExecIsInsteadOfTrigger') AS [isinsteadof],
OBJECTPROPERTY([so].[object_id], 'ExecIsTriggerDisabled') AS [disabled]
FROM sys.objects AS [so]
INNER JOIN sys.objects AS so2 ON so.parent_object_id = so2.object_id
WHERE [so].[type] = 'TR';