sp_updatestats 似乎不适用于非系统管理员登录

Geo*_*e K 3 sql-server permissions

Microsoft SQL Server 2017 (RTM-CU16)

尝试db_owner通过作为数据库角色成员的用户更新统计信息时

EXEC sp_updatestats;

SQL Server 抛出错误:

消息 15247,级别 16,状态 1,过程 sp_updatestats,第 15 行 [批处理起始行 0] 用户无权执行此操作。

即使 MS在这里声明“数据库的所有权(dbo)”就足够了,但似乎并非如此。

sep*_*pic 5

你误解了这句话

需要 sysadmin 固定服务器角色的成员身份,或数据库 (dbo) 的所有权

“数据库所有权”表示此登录名拥有此数据库。

这是不一样的“是一员db_owner database role

Owner一个数据库是一个login,而 db_owners 可能是你想要的。

事实上,如果你执行

exec sp_helptext 'sp_updatestats';
Run Code Online (Sandbox Code Playgroud)

在第一行你会发现:

declare @dbsid varbinary(85)

select @dbsid = owner_sid
    from sys.databases
    where name = db_name()

-- Check the user sysadmin
if not is_srvrolemember('sysadmin') = 1 and suser_sid() <> @dbsid
begin
    raiserror(15247,-1,-1)
    return (1)
end
Run Code Online (Sandbox Code Playgroud)

这控制执行者是sysadmin服务器角色的成员还是owns此数据库的成员:suser_sid() <> @dbsidwhere @dbsidis owner_sidof current database

要找出某些数据库的所有者,您应该执行

select owner_sid
from sys.databases
where name = 'some_db';
Run Code Online (Sandbox Code Playgroud)

您也可以使用 SSMS 找到它:

在此处输入图片说明