我正在努力更好地理解为什么我们的某个数据库更新脚本无法在特定客户站点上正常工作,并将其缩小(我认为)到数据库所有权和角色。
免责声明:我实际上正在等待客户DBA的回复,以便他们可以告诉我们他们最近是否升级了他们的SQL数据库,因此我们可以查看他们的数据库。我认为如果我们的应用程序的数据库登录转换为模式,SQL 2000到SQL 2005的转换可能会混淆我们的脚本,因为我们在更新脚本的几个地方引用了
dbo
。
无论如何,我一直试图找到更好的数据库所有权和角色的解释,以及当你没有在T-SQL语句中明确指定所有者时,它如何影响实际分配数据库对象的所有者。例如,我们的更新脚本通常只执行CREATE TABLE foo
而不是CREATE TABLE dbo.foo
或其他内容,但我发现有一些明确使用dbo
,而这些是目前导致问题的那些(仅限这一位客户)。
我发现this article(特定于SQL Server 2000),但该页面上的表格令人困惑。它提到db_owner
和“拥有数据库”作为用户可以拥有的角色的两种不同的可能性。
例如,该表说明,如果sam
角色中的用户db_owner
运行查询CREATE TABLE [test3](abc int)
,则该帐户将归sam
所有。
然后提到如果另一个用户sue
,“拥有数据库”(原文如此),运行相同的查询,它将归dbo
所有。
不会db_owner
和“拥有数据库”是一回事吗?该表暗示“处于db_owner
角色”与实际“成为数据库所有者”之间存在差异。但是,如果这是真的,如果它不是db_owner
角色的成员,那么“拥有数据库”是什么意思?
答案 0 :(得分:28)
不,db_owner和数据库的所有者不一样。 dbo是用户,db_owner是数据库角色。数据库由登录拥有。无论登录拥有什么数据库,数据库中的别名为dbo
。您可以使用sp_changedbowner
系统存储过程更改数据库所有者。
数据库中的所有对象都归用户所有。作为db_owner角色成员的用户以及其他权限可以创建dbo拥有的对象。如果用户不是db_owner的成员,但具有一些创建权限(例如Create Table),则他们创建的任何对象将由创建它们的用户拥有。您可以使用sp_changeobjectowner
系统存储过程更改对象的所有权。