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

Sql server SQL Server是否存储最初创建用户定义函数的用户的名称?,sql-server,user-defined-functions,Sql Server,User Defined Functions,我需要能够了解最初创建用户定义函数的用户的名称 我可以使用以下代码检索函数的其余信息,但sys.objects没有最初创建函数本身的用户id: SELECT * FROM sys.objects WHERE object_id = 123456 我得到的是名称、创建日期、上次修改等,但不是原始用户的名称或标识符。如果对象不是由数据库所有者创建的,则部分是,否则您将看到一个dbo作为创建者: USE db; SELECT so.name AS [ObjectName], su.na

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

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

SELECT
*
FROM sys.objects
WHERE object_id = 123456
我得到的是名称、创建日期、上次修改等,但不是原始用户的名称或标识符。

如果对象不是由数据库所有者创建的,则部分是,否则您将看到一个
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语句执行的历史记录 默认跟踪记录的数据库“:

部分情况下,如果对象不是由数据库所有者创建的,则您将看到
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语句执行的历史记录 默认跟踪记录的数据库“:


如果每个用户在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

如果每个用户在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

看一眼看一眼谢谢!这告诉了我需要知道的。这是错误的,
sysusers
上的连接完全是假的。正确的连接应该是
从sysobjects中选择so.name作为[ObjectName],选择s.name作为[SchemaName],以便在s.schema_id=so.uid上连接sys.schemas,其中so.id=OBJECT_id('Foobar.Bar')因为这只返回有关对象架构的信息,而不是谁创建了它。请参阅@MartinSmith,感谢您指出此错误信息谢谢!这告诉了我需要知道的。这是错误的,
sysusers
上的连接完全是假的。正确的连接应该是
从sysobjects中选择so.name作为[ObjectName],选择s.name作为[SchemaName],以便在s.schema_id=so.uid上连接sys.schemas,其中so.id=OBJECT_id('Foobar.Bar')因为这只返回有关对象架构的信息,而不是谁创建了它。请参阅@MartinSmith,感谢您指出此错误信息谢谢!这告诉了我我需要知道的。谢谢!这告诉了我我需要知道的。