SQL Server主体“dbo”不存在,

时间:2012-12-11 15:43:47

标签: 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.

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

13 个答案:

答案 0 :(得分:279)

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

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

答案 1 :(得分:84)

enter image description here

以图形方式进行。

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

答案 2 :(得分:34)

USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication

KB913423 - You cannot run a statement or a module that includes the EXECUTE AS clause after you restore a database in SQL Server 2005

答案 3 :(得分:10)

当数据库是从其他SQL服务器或实例还原时,也可能发生这种情况。在这种情况下,安全负责人&#39; dbo&#39;数据库中的数据库与还原数据库的SQL服务器上的安全主体不同。 不要问我怎么知道这个...

答案 4 :(得分:6)

另一种方式

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];

答案 5 :(得分:6)

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

enter image description here

答案 6 :(得分:4)

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

错误提及的数据库所有者帐户dbo始终使用数据库创建。所以它似乎很奇怪,它不存在,但你可以检查两个选择(或一个但让我们保持简单)。

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'

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

SELECT [name],[sid] 
FROM [sys].[syslogins]

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

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

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

答案 7 :(得分:2)

如果以上操作不起作用,请尝试以下操作。即使为数据库定义了所有者,它也为我解决了这个问题。

SQL Server 2008 replication failing with: process could not execute 'sp_replcmds'

答案 8 :(得分:0)

在“安全性”下,将主体添加为“无需登录的SQL用户”,使其拥有与主体相同名称的架构,然后在“成员身份”中将其命名为db_owner。

答案 9 :(得分:0)

当不小心将数据库连接字符串馈送到只读镜像而不是HA设置中的主数据库时,也会发生此错误。

答案 10 :(得分:0)

如消息所述,您应该将权限设置为用户的所有者。因此,您可以使用以下内容:

ALTER AUTHORIZATION 
ON DATABASE::[YourDBName]
TO [UserLogin];

希望对您有所帮助! 如果可以的话,发表评论。

答案 11 :(得分:0)

就我而言,我在尝试模拟为另一个用户时遇到此错误。例如

EXEC AS USER = 'dbo';

由于数据库是从另一个环境导入的,因此其某些用户与SQL Server登录名不匹配。

您可以通过运行(不建议使用的)sp_change_users_login(在“报告”模式下)或使用以下查询来检查是否存在相同的问题:

select p.name,p.sid "sid in DB", (select serp.sid from sys.server_principals serp where serp.name = p.name) "sid in server"
from sys.database_principals p
where p.type in ('G','S','U')
and p.authentication_type = 1
and p.sid not in (select sid from sys.server_principals)

如果该列表中显示您要模拟的用户,则可以通过将数据库用户分配给服务器中的正确登录名来修复它。例如:

ALTER USER dbo WITH LOGIN = dbo;

答案 12 :(得分:0)

转到属性 - 文件。 所有者名称必须为空。只需在用户名中输入“sa”即可解决问题。