今天在解决服务代理问题时,我发现数据库所有者是一名离职员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。
据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。
我的(非常基本的)问题:什么是数据库所有者,它的目的是什么?
今天在解决服务代理问题时,我发现数据库所有者是一名离职员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。
据说处理这个问题的最佳实践是让“sa”成为数据库所有者。我们更改了它并清除了队列。
我的(非常基本的)问题:什么是数据库所有者,它的目的是什么?
一方面的“dbo”(用户)和“db_owner”(固定角色)的数据库概念与另一侧的“数据库所有者”的实例概念之间存在一些混淆。“dbo”和“db_owner”通常被称为“数据库所有者”。在您所问的内容中,您正在谈论数据库所有者作为拥有数据库的服务器主体。
理论是这样的:任何可以被授予权限的东西都是“安全的”。所有有价证券都有一个所有者。担保物的所有者对担保物拥有绝对的控制权,并且不能被剥夺任何特权。实例级安全对象由服务器主体(登录)拥有。数据库级安全对象由数据库主体(用户)拥有。主要有两种形式:主要(身份)和次要(成员)。默认情况下,服务器级别的安全对象归当前记录的主服务器主体所有。默认情况下,数据库级别的安全对象由当前数据库主体拥有,但默认情况下由架构所有者拥有的架构绑定对象除外。所有安全对象在创建时都支持 AUTHORIZATION 子句以强制执行不同的所有者。
ALTER AUTHORIZATION
以后可以用来更改任何安全对象的所有者。由于数据库是服务器级别的安全数据库,因此默认情况下,它将由发出 CREATE DATABASE 语句的主要主体拥有。IE。离职员工的 NT 登录。
因此,您的问题实际上是“为什么安全对象需要所有者? ”。因为所有者是信任的根源。授予、拒绝和撤销对象权限的是所有者。可以设计一个没有安全资产所有者的安全系统吗?可能是的,但必须有某种机制来取代当前模型中所有者所扮演的角色。例如,考虑爸爸安全对象没有所有者(例如,原始创建者只是被授予对它的控制权,而不是拥有安全对象),这将有可能创建一个安全对象并撤销对所有人的访问权限,包括他自己。业主的要求规避了这个问题,因为业主不能把自己锁在外面。
创建原始 NT 登录拥有的安全(数据库)的 CREATE DATABASE 的鲜为人知的副作用之前已经烧毁了很多。每个安全对象的规则都是相同的,但有些因素会加剧 DATABASE 所有者的问题:
dbo
(数据库主体)或其他数据库主体所有,因此所有者包含在数据库中EXECUTE AS context
. 后一个问题是大多数用户的痛点。由于 Service Broker 广泛使用 EXECUTE AS(消息传递具有隐式的 EXECUTE AS 上下文,以及具有显式上下文的队列激活),通常是 Service Broker 用户首先发现此问题。顺便说一句,感谢调查和解决您的原始问题 :)
该数据库
owner
有点回到 SQL Sever 2005 中引入(正确)模式之前的时间。基本上,数据库所有者是数据库的默认
dbo
(数据库所有者),数据库本身就是数据库对象。从SQL Server 2000文档...
在 SQL Server 的早期版本中,当一个模式不能“拥有”一个对象(或者更确切地说,应该声明所有对象、表、视图等都归其所有
dbo
并且没有其他模式)时,就需要一个“用户”拥有它......它应该不用说为什么需要拥有数据库(否则一般来说权限会相当困难。)因此,从技术上讲,在旧版本的 SQL Server(或升级的数据库)中,它不是“Foo”表,而是“dbo.Foo”表......拥有
dbo
者。随着 SQL Server 2005 的出现,您可以拥有架构拥有的数据库对象,例如说您有一个名为“bar”的架构和一个名为“Foo”的表……这变成
bar.Foo
了……棘手的部分是创建数据库的用户被自动设置为所有者,这会导致员工离职等问题。
因此,最好的做法是将其更改为
sa
帐户,或者(根据我的经验)更改为可由组织的运营/IT 团队管理的域帐户。本文对较旧的“所有者”做事方式和较新的基于“模式”的所有权系统之间的区别进行了分解。