SQL Server主体"dbo"不存在,

PBG*_*PBG 162 sql-server-2008

我收到以下错误

Cannot execute as the database principal because the principal "dbo" 
does not exist, this type of principal cannot be impersonated,
or you do not have permission.
Run Code Online (Sandbox Code Playgroud)

我读到了ALTER AUTHORIZATION,但我不知道这是发生了什么数据库.这个错误很频繁地吐出来,并且每天将错误日志增加大约1GB.

Hog*_*gan 336

我通过设置数据库所有者来解决此问题.在此问题之前,我的数据库没有任何所有者.在数据库中执行此命令以将所有者设置为sysadmin帐户:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Run Code Online (Sandbox Code Playgroud)

  • 请参阅此处的详细文章:http://sqlserver-help.com/tag/cannot-execute-as-the-database-principal-because-the-principal/ (5认同)
  • @hurleystylee,你的解决方案实际上对我有用.我的DB有一个拥有者btw. (5认同)
  • @hurleystylee是的,我看到他做到了.我认为这样的答案就会变得更加完整. (2认同)

arn*_*nav 95

在此输入图像描述

做图形.

数据库右键单击 - >属性 - >文件 - >选择数据库所有者 - >选择[sa] - 确定

  • 我们从 diff SQL 实例恢复了数据库。我按照这个步骤操作并且成功了..谢谢! (2认同)

小智 35

USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication
Run Code Online (Sandbox Code Playgroud)

KB913423 - 在SQL Server 2005中还原数据库后,无法运行包含EXECUTE AS子句的语句或模块


小智 11

当数据库是从不同的SQL服务器或实例还原时,也可能发生这种情况.在这种情况下,数据库中的安全主体"dbo"与恢复数据库的SQL Server上的安全主体不同.不要问我怎么知道这个......

  • 嘿,这对我有用:http://dba.stackexchange.com/questions/50690/error-on-changing-ownership-of-database-from-files-page-in-database-properties-d (2认同)

小智 9

将数据库从 SQL2016 恢复到 SQL2019 后,当我尝试访问数据库图表时遇到了同样的问题。我已经有了正确的数据库所有者,但文件的所有者为空。一旦我设置了它,它就可以正常工作......

在此处输入图片说明


Biz*_*ime 6

选择的答案和其他一些都很好。我只想给出一个更纯 SQL 的解释。同样的解决方案是没有(有效的)数据库所有者。

dbo错误提到的数据库所有者帐户总是与数据库一起创建。因此,它不存在似乎很奇怪,但您可以检查两个选择(或一个,但让我们保持简单)。

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'
Run Code Online (Sandbox Code Playgroud)

它显示dbo了 DB_NAME 数据库中用户的SID和

SELECT [name],[sid] 
FROM [sys].[syslogins]
Run Code Online (Sandbox Code Playgroud)

显示此 SQL 服务器实例的所有登录名(及其 SID)。注意它没有写任何 db_name 前缀,这是因为每个数据库在该视图中都有相同的信息。

因此,如果出现上述错误,将不会使用分配给数据库 dbo 用户的 SID 登录。

如上所述,这通常发生在从另一台计算机恢复数据库时(其中数据库和 dbo 用户是由不同的登录名创建的)。您可以通过将所有权更改为现有登录来修复它。


Mug*_*ara 6

这样做的另一种方式

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
Run Code Online (Sandbox Code Playgroud)