【问题标题】:What is the difference between "db_owner" and "the user that owns the database" in SQL Server 2000?SQL Server 2000 中的“db_owner”和“拥有数据库的用户”有什么区别?
【发布时间】:2011-02-13 11:28:42
【问题描述】:

我试图更好地理解为什么我们的一个数据库更新脚本无法在特定客户站点正常工作,并将其范围缩小(我认为)为数据库所有权和角色。

免责声明:我实际上正在等待客户 DBA 的回复,以便他们告诉我们他们最近是否升级了 SQL 数据库,以便我们查看他们的数据库。我认为如果我们的应用程序的数据库登录被转换为模式,SQL 2000 到 SQL 2005 的转换可能会破坏我们的脚本,因为我们在更新脚本的几个地方引用了dbo

无论如何,我一直在尝试更好地解释数据库所有权和角色,以及当您没有在 T-SQL 语句中明确指定所有者时,它如何影响数据库对象实际分配的所有者。例如,我们的更新脚本通常只执行CREATE TABLE foo 而不是CREATE TABLE dbo.foo 或其他内容,但我发现有一些明确使用dbo,而这些是目前导致问题的原因(仅针对这个客户)。

我找到了this article(特定于 SQL Server 2000),但该页面上的表格令人困惑。它提到db_owner 和“拥有数据库”作为用户可以担任什么角色的两种不同可能性。

例如,该表指出,如果具有db_owner 角色的用户sam 运行查询CREATE TABLE [test3](abc int),它将归sam 所有。

然后它提到如果“拥有数据库”(原文如此)的另一个用户 sue 运行相同的查询,它将归 dbo 所有。

db_owner 和“拥有数据库”不是一回事吗?该表暗示“处于db_owner 角色”和实际上“成为数据库的所有者”之间存在差异。但是,如果这是真的,那么“拥有数据库”不是db_owner 角色的成员,这意味着什么?

【问题讨论】:

    标签: sql sql-server permissions sql-server-2000


    【解决方案1】:

    不,db_owner 和数据库的所有者不一样。 dbo 是用户,db_owner 是数据库角色。数据库由登录名拥有。无论登录名拥有数据库,都在数据库中别名为dbo。您可以使用sp_changedbowner 系统存储过程更改数据库所有者。

    数据库中的所有对象都归用户所有。作为 db_owner 角色成员的用户,除其他权限外,还允许创建 dbo 拥有的对象。如果用户不是 db_owner 的成员,但具有一些创建权限(例如 Create Table),那么他们创建的任何对象都将归创建它们的用户所有。您可以使用sp_changeobjectowner 系统存储过程更改对象的所有权。

    【讨论】:

    • 清晰明了。真棒答案!对于其他阅读本文的人,我只想添加我通过更多研究和一些测试发现的另一件事。如果数据库登录名是sysadmin 服务器角色的成员,则由该登录名创建的数据库对象将归dbo 所有,并且(对于 SQL Server 2005),它们还将默认添加到 dbo 架构中,除非您指定不同的所有者/架构。
    • 顺便说一句,我想我现在知道问题所在了。通常,我们会为客户提供一个空数据库,当他们安装应用程序时将其附加到他们的 SQL Server。所有对象都归dbo 所有。我们还有一个脚本,用于创建我们的应用程序使用的数据库登录。事实证明,这个脚本将应用程序的登录添加到sysadmin 服务器角色(不知道为什么要这样写)。我的猜测是一位勤奋的 DBA 看到了这一点,并从 sysadmin 角色中删除了我们的登录名,因为他们的服务器上有多个数据库,而我们的应用显然不应该是 sysadmin
    • 我们的脚本也没有将登录映射到数据库用户。尽管如此,该应用程序仍然可以正常工作,因为登录名是作为sysadmin 创建的。但是,如果 DBA 从 sysadmin 角色中删除登录名,他们将不得不将登录名映射到我们数据库中的特定数据库用户,以便我们的应用程序可以连接。当他们这样做时,他们将用户的默认模式设置为与用户名相同。我们的更新脚本删除并重新创建了一些数据库视图,但我们没有在视图名称前加上所有者/模式,因此它们被添加到数据库用户的模式而不是 dbo 模式中。
    • 那么,最后,我们的更新脚本中有一个CREATE VIEW 查询,它确实 为它使用的其他视图添加了dbo 前缀。由于脚本已经删除并重新创建了其他视图,因此它们现在位于数据库用户的架构中,因此数据库无法在 dbo 架构中找到它。
    • @Mike Spross- 哇,事情的进展如何。是的,任何应用程序都不应该让其用户依赖于系统管理员。 db_owner 也许但不是系统管理员。当 DBA 进行此更改时,他们是先对其进行测试还是仅在实际环境中进行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多