数据库“所有者”的目的是什么?

8kb*_*8kb 54 sql-server-2008 sql-server permissions service-broker

今天在对服务代理问题进行故障排除时,我发现数据库所有者是离开公司的员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。

据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。

我的(非常基本的)问题:数据库所有者是什么,其目的是什么?

Rem*_*anu 61

一侧的“dbo”(用户)和“db_owner”(固定角色)的数据库概念与另一侧的“数据库所有者”的实例概念之间存在一些混淆。“dbo”和“db_owner”通常被称为“数据库所有者”。在您所问的问题中,数据库所有者是拥有数据库的服务器主体。

理论是这样的:任何可以被授予权限的都是“安全的”。所有证券都有一个所有者。担保物的所有者对担保物拥有绝对的控制权,并且不能被剥夺任何特权。实例级别的安全对象由服务器主体(登录名)拥有。数据库级别的安全对象由数据库主体(用户)拥有。Principal 有两种风格:主要(身份)和次要(会员)。默认情况下,服务器级别的安全对象由当前记录的主服务器主体拥有。默认情况下,数据库级别的安全对象由当前数据库主体拥有,但默认情况下由架构所有者拥有的架构绑定对象除外。所有安全对象在创建时都支持 AUTHORIZATION 子句以强制执行不同的所有者。ALTER AUTHORIZATION 以后可用于更改任何安全对象的所有者。

由于数据库是服务器级安全的,因此默认情况下,它将由发出 CREATE DATABASE 语句的主要主体拥有。IE。离职员工的 NT 登录信息。

所以你的问题真的是“为什么安全需要一个所有者? ”。因为所有者是信任的根源。授予、拒绝和撤销对对象的权限是所有者。可以在没有安全资产所有者的情况下设计安全系统吗?可能是的,但必须有某种机制来取代当前模型中所有者所扮演的角色。例如,考虑到父亲安全对象没有所有者(例如,原始创建者不是拥有安全对象,而是被授予对其的控制权),可能会创建一个安全对象并撤销对所有人的访问权限,包括他自己。所有者的要求规避了这个问题,因为所有者不能将自己锁在外面。

CREATE DATABASE 创建由原始 NT 登录拥有的安全(数据库)的鲜为人知的副作用之前已经烧毁了很多。每个安全对象的规则都相同,但有些因素会加剧 DATABASE 所有者问题:

  • 其他服务器级别的安全对象(端点、服务器角色、登录)很少使用、移动等。
  • 数据库级别的安全对象通常最终由dbo(数据库主体)或其他一些数据库主体拥有,因此所有者包含在数据库中
  • 将数据库所有权默认为 NT 主要主体会产生一个包含问题(所有者是由 AD 管理的 NT SID,并且不会随数据库文件一起移动,NT 帐户可能会被篡改等等)
  • 最重要的是:数据库所有者有重要的副作用,特别是EXECUTE AS context. 这个后来的问题是大多数用户的问题。由于 Service Broker 广泛使用 EXECUTE AS(消息传递具有隐式 EXECUTE AS 上下文,以及具有显式上下文的队列激活)通常是首先发现此问题的 Service Broker 用户。

顺便说一句,感谢调查和解决您的原始问题:)


小智 14

该数据库owner有点回到 SQL Sever 2005 中引入(适当的)模式之前的时代。

基本上,数据库所有者是数据库的默认dbo(数据库所有者),数据库本身就是一个数据库对象

SQL Server 2000文档...

dbo是,已经暗示权限来执行数据库中所有活动的用户。

在 SQL Server 的早期版本中,当架构不能“拥有”一个对象(或者更确切地说,应该声明所有对象、表、视图等都归其所有,dbo并且没有其他架构)时,需要一个“用户”拥有它......不言而喻为什么某些东西需要拥有数据库(否​​则一般来说权限会相当困难。)

因此,从技术上讲,在旧版本的 SQL Server(或升级的数据库)中,它不是“Foo”表,而是“dbo.Foo”表......dbo作为所有者。

随着 SQL Server 2005 的出现,你可以拥有模式拥有的数据库对象,比如你有一个名为“bar”的模式和名为“Foo”的表......这变成bar.Foo了......

SELECT * FROM bar.Foo WHERE etc = 'blah`;
Run Code Online (Sandbox Code Playgroud)

棘手的部分是创建数据库的用户被自动设置为所有者,这会导致员工离职等问题。

因此,最佳做法是将其更改为sa帐户,或者(根据我的经验)更改为可由组织的操作/IT 团队管理的域帐户。

本文详细介绍了旧的“所有者”做事方式与新的基于“模式”的所有权系统之间的区别。

要了解所有者和模式之间的区别,让我们花一些时间回顾一下对象所有权。在 SQL Server 2000 或更早版本中创建对象时,该对象必须具有所有者。大多数情况下,所有者是“dbo”,也称为数据库所有者。