我收到以下错误
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。
答案 0 :(得分:279)
我通过设置数据库所有者来解决此问题。在此问题之前,我的数据库没有任何所有者。在数据库中执行此命令以将所有者设置为sysadmin帐户:
use [YourDatabaseName] EXEC sp_changedbowner 'sa'
答案 1 :(得分:84)
答案 2 :(得分:34)
USE [<dbname>]
GO
sp_changedbowner '<user>' -- you can use 'sa' as a quick fix in databases with SQL authentication
答案 3 :(得分:10)
当数据库是从其他SQL服务器或实例还原时,也可能发生这种情况。在这种情况下,安全负责人&#39; dbo&#39;数据库中的数据库与还原数据库的SQL服务器上的安全主体不同。 不要问我怎么知道这个...
答案 4 :(得分:6)
另一种方式
ALTER AUTHORIZATION
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
答案 5 :(得分:6)
答案 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”即可解决问题。