SQL Server是否存储最初创建用户定义函数的用户名?

时间:2019-01-29 19:34:43

标签: sql-server user-defined-functions

我需要能够了解最初创建用户定义函数的用户的名称。

我可以使用以下代码来检索该函数的其余信息,但是sys.objects没有最初创建该函数本身的用户ID:

SELECT
*
FROM sys.objects
WHERE object_id = 123456

我得到名称,创建日期,最后修改日期等信息,但没有原始用户的名称或标识符。

2 个答案:

答案 0 :(得分:2)

部分地,如果对象不是数据库所有者创建的,则您将看到dbo作为创建者:

USE db;
SELECT so.name AS [ObjectName],
       su.name AS [UserName]
FROM sysobjects so
    JOIN sysusers su
        ON su.uid = so.uid
WHERE so.id = OBJECT_ID('FunctionName');


更新:马丁史密斯的评论是正确的。从SQL Server 2005开始:

  

默认情况下,当开发人员在架构中创建对象时,这些对象   由拥有架构的安全主体拥有,而不是   开发人员。可以使用ALTER转移对象所有权   授权Transact-SQL语句。

因此,如果显式指定了所有权,则可以从sys.objects中检索它:

ALTER AUTHORIZATION ON OBJECT::myFunction TO someUser

-- returns non-null value after transfer:
SELECT principal_id FROM sys.objects WHERE OBJECT_ID = OBJECT_ID('myFunction')

否则,新创建的对象由“模式所有者”拥有。因此,无法查询谁是最初的所有者/创建者。

作为最后的手段,建议使用@John Cappelletti。他与类似主题的链接有一个答案:

  

如果对象是最近创建的,则可以检查模式更改   SQL Server Management Studio中的“历史记录”报告   “提供了历史记录中所有已提交的DDL语句执行的历史记录   默认跟踪记录的数据库”:

答案 1 :(得分:-1)

如果每个用户在SQL Server中都有自己的登录名。您可以从sysobjects获取它。检查下面的代码

select  so.name, u.name, so.crdate 
from  sysobjects so 
inner join sysusers u 
  on so.uid = u.uid  
order by 
    so.crdate