none
如何查询数据库对象的所有者? RRS feed

  • 问题

  • 在SQL Server 2005之前,如果你在一个架构中创建数据库对象,那么这个数据库对象的所有者是当前创建对象的用户。但是在SQL Server 2005及之后的版本中,不再遵循这个原则。默认情况下,这个数据库对象的所有者是这个架构的所有者,而不是这个用户。当然,我们通过ALTER AUTHORIZATION可以对这两种方式产生的数据库对象的所有者进行更改。

    因此,这里产生了一个问题:在SQL Server 2005及以后的版本中,我们怎么知道数据库对象的所有者?
    2011年8月12日 11:25
    版主

答案

  • 下面是两种可能的情况:

    1. 如果这个对象的所有者没有被更改过,那么它对应的架构的所有者就是它的所有者。
    2. 如果这个对象的所有者被更改了,我需要去查找更改后的所有者是谁。

    幸运的是,在对象目录视图sys.objects中,principal_id字段隐含了这个信息。如果这个字段值是NULL,那么这个对象的所有者是它架构的所有者。如果不是NULL,那么这个principal_id就代表它的所有者。下面的语句可以根据数据库对象查询它所对应的所有者:

    SELECT
    	o.name AS OBJECT_NAME,
    	CASE
    		WHEN o.principal_id IS NULL THEN dp2.name
    	ELSE dp.name END AS Object_Owner
    FROM
    	sys.objects AS o
    	LEFT JOIN sys.schemas AS s
    	ON o.schema_id = s.schema_id
    	LEFT JOIN sys.database_principals AS dp
    	ON o.principal_id = dp.principal_id
    	INNER JOIN sys.database_principals AS dp2
    	ON s.principal_id = dp2.principal_id
    
    WHERE o.object_id = OBJECT_ID(N'input_object_name_here')

     
    2011年8月12日 11:26
    版主