原文地址:https://blog.dbi-services.com/sql-server-cannot-execute-as-the-database-principal-dbo-does-not-exist/
原文作者:Stéphane Haby
- 本月在客户方,我看到一个非常大的报错日志文件(超过1.5GB)。
当我打开这个日志文件时,每隔5秒,就会新增一条以下报错信息:
以上图片中的报错信息即:激活的进程“[dbo].[IdentityServerNotificationCleanup]”在队列[database].dbo.IdentityServerNotificationsQueue”上运行。 输出以下内容:“无法作为数据库主体执行,因为主体“dbo”不存在,无法模拟此类型的主体,或者您没有权限。”
我第一反应是打开SSMS(SQL Server Management Studio ),右键点击数据库查看属性,但映入我眼帘的是以下错误信息:
以上图片中的报错信息即:“此属性所有者无法访问数据库‘
[database]’”,此错误导致我无法查看属性。
1. 如下查询语句,可显示所有owner_sid与视图sys.databases:
SELECT name, owner_sid FROM sys.databases
此查询结果展示给我2种类型的sid:
0x01谁是SQL登录 SA
0x0105…Windows窗口身份验证在哪里
2. 为了获得更多信息,我用SUSER_SNAME把名称与owner_sid关联:
SELECT name, owner_sid, SUSER_SNAME(owner_sid) as owner_name FROM sys.databases
正如我们在上述查询结果中看到的,对于许多数据库,一些owner_name的值为NULL。
3. 为了避免这种情况,我强制把“sa”帐户设为所有者。
我想为每行生成一个结果,在我的查询中,如下命令会用到sp_changedbowner和一个子句where SNAME(owner_sid) is null:
SELECT name, owner_sid,SUSER_SNAME(owner_sid) as owner_name,N'use ['+name+N'];
EXEC sp_changedbowner ''sa'';' as Script_change_owner FROM sys.databases where SUSER_SNAME(owner_sid) is null
以上语句,会生成脚本,并使所有数据库再次具有有效的所有者。
最后,在错误日志中每隔5秒不再有报错信息,而且可以在回收后准确读取文件。
当然,我现在通过SSMS打开属性时也不会出现报错信息。
如果您也遇到同样的报错信息,我希望这个博客和脚本可以帮助到您。
最后修改时间:2022-03-29 09:41:06
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。