【问题标题】:SQL Server principal "dbo" does not exist,SQL Server 主体“dbo”不存在,
【发布时间】:2012-11-29 04:31:53
【问题描述】:

我收到以下错误

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。

【问题讨论】:

  • 这可能是 DBA 站点的一个问题,但如果您提供有关错误何时出现的更多信息(即无法执行哪些命令)会有所帮助。这个错误有很多搜索结果,包括this question;您是否看过它们,它们是否与您的情况和配置相匹配?

标签: sql-server-2008


【解决方案1】:

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

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

【讨论】:

  • 在此处查看详细文章:sqlserver-help.com/tag/…
  • @hurleystylee,您的解决方案实际上对我很有效。顺便说一句,我的数据库有一个所有者。
  • 我遇到了同样的问题。我试图通过它执行的@hurleystylee 运行查询,但它没有做任何事情。当我检查 dbo 仍然是 db_owner 时,我不能对 DBO 做任何事情。它变得非常令人沮丧。我无法改变任何事情。
  • @hurleystylee 请考虑编辑和补充答案,这样人们就不必查看 cmets 来找出命令语法。
  • @hurleystylee 是的,我看到他做到了。我认为这样答案本身就变得更加完整。
【解决方案2】:
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】:

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

    【讨论】:

    • 请问如何解决?大声笑,这正是我想要做的。在不同服务器之间移动数据库图,然后实现数据库。导入 .bak 文件并尝试打开图表文件夹后出现此错误。
    • @ironstone13 对我不起作用。我收到无法删除 dbo 的消息
    【解决方案4】:

    以图形方式进行。

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

    【讨论】:

    • 再次参考这个答案解决了我的问题。
    • 成功了!谢谢!
    • 我们从 diff SQL 实例恢复了数据库。我按照这一步,它的工作.. 谢谢!
    • 工作完美。谢谢!
    【解决方案5】:

    选择的答案和其他一些都很好。我只是想给出一个更纯粹的 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 用户是由不同的登录名创建的)。您可以通过将所有权更改为现有登录来修复它。

    【讨论】:

      【解决方案6】:

      另一种方法

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 这在 SSMS 2017 上没有任何作用
        【解决方案8】:

        当不小心将数据库连接字符串提供给只读镜像(而不是 HA 设置中的主数据库)时,也会出现此错误。

        【讨论】:

          【解决方案9】:

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

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

          希望有帮助! 如果您觉得可以,请发表评论。

          【讨论】:

            【解决方案10】:

            在我的情况下,我在尝试冒充其他用户时遇到此错误。例如

            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)
            

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

            ALTER USER dbo WITH LOGIN = dbo;
            

            【讨论】:

              【解决方案11】:

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

              【讨论】:

              • 事实证明这正是我的问题。事实上,我将所有者更改为“sa”而不是我想要的所有者,它仍然有效。谢谢你。
              • 谢谢,它对我有用,我更喜欢在此菜单上写下所有者,而不是运行 T-SQL ALTER.... 一个问题:在我进行此更改之前:如果你查看数据库的属性它是数据库所有者的所有者,但如果我在文件中看到所有者没有,¿为什么会有这种差异?来自墨西哥的问候
              【解决方案12】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-02-02
                • 1970-01-01
                • 2021-07-22
                • 1970-01-01
                • 2011-06-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多