我需要能够了解最初创建用户定义函数的用户的名称。
我可以使用以下代码来检索该函数的其余信息,但是sys.objects没有最初创建该函数本身的用户ID:
SELECT
*
FROM sys.objects
WHERE object_id = 123456
我得到名称,创建日期,最后修改日期等信息,但没有原始用户的名称或标识符。
答案 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