SQL Server principal "dbo"不存在,

我得到以下错误

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的速度增长。

261843 次浏览

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

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

KB913423 -在SQL Server 2005中恢复数据库后,不能运行包含EXECUTE AS子句的语句或模块

当数据库是从不同的SQL服务器或实例恢复时,也可能发生这种情况。在这种情况下,数据库中的安全主体'dbo'与恢复数据库的SQL服务器上的安全主体不相同。 不要问我是怎么知道的……< / p >

enter image description here

做图形。

数据库右键点击——>属性——>文件——>选择数据库所有者——>选择[sa]——ok

选择的答案和其他一些都很好。我只是想给出一个更纯粹的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服务器实例的所有登录名(及其sid)。注意,它没有写任何db_name前缀,这是因为每个数据库在该视图中都有相同的信息。

因此,在上述错误的情况下,不会是登录SID分配给数据库dbo用户。

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

另一种方法

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

在Security下,将主体添加为“未登录的SQL用户”,使其拥有与主体同名的模式,然后在Membership中将其设置为db_owner。

当意外地将数据库连接字符串提供给只读镜像时也有此错误-而不是HA设置中的主数据库。

正如消息所说,您应该将权限设置为用户的所有者。所以你可以使用以下语句:

ALTER AUTHORIZATION
ON DATABASE::[YourDBName]
TO [UserLogin];
< p >希望有帮助!

.

.

在我的情况下,我得到这个错误时,试图冒充另一个用户。如。

EXEC AS USER = 'dbo';

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

你可以通过运行(已弃用)sp_change_users_login(在"Report"Mode),或使用以下查询:

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)

如果在该列表中显示了您试图模拟的用户,那么您可能可以通过将DB用户分配给服务器中的正确登录来修复它。例如:

ALTER USER dbo WITH LOGIN = dbo;

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

enter image description here

进入属性-文件。 所有者名称必须为空。只要写上“;sa"

.输入用户名,问题将得到解决