AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18610
Accepted
8kb
8kb
Asked: 2012-05-31 22:01:51 +0800 CST2012-05-31 22:01:51 +0800 CST 2012-05-31 22:01:51 +0800 CST

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

  • 772

今天在解决服务代理问题时,我发现数据库所有者是一名离职员工的 Windows 登录名。他的登录名已被删除,因此查询通知失败。

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

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

sql-server sql-server-2008
  • 2 2 个回答
  • 68599 Views

2 个回答

  • Voted
  1. Best Answer
    Remus Rusanu
    2012-06-01T01:05:39+08:002012-06-01T01:05:39+08:00

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

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

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

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

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

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

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

    • 64
  2. Justin Jenkins
    2012-05-31T23:25:08+08:002012-05-31T23:25:08+08:00

    该数据库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`;
    

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

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

    本文对较旧的“所有者”做事方式和较新的基于“模式”的所有权系统之间的区别进行了分解。

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

    • 15

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve