为什么我的查询为触发器返回了错误的模式名称?

时间:2014-06-23 12:38:02

标签: sql-server

我通过这个简单的查询在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版本)

1 个答案:

答案 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';