sqlserver中的架构(schema)与所有者(owner)

2.6 架构

2.6.1 架构

架构(Schema)是一个命名的数据库对象容器,每个数据库对象(视图、表、函数等)都属于一个架构。

架构将数据库对象分组为单独的命名空间,不同的架构中可以出现重名的对象。因此,访问一个数据库对象时,通常应该是两段式名称:<架构名>.<对象名>。

可以对架构应用安全规则,安全规则将由架构中的所有对象继承。如果设置了对架构的访问权限,则当新对象添加到架构时,新对象会自动应用这些权限。用户不从架构继承权限;架构权限仅由架构中包含的数据库对象继承。

在 SQL Server 2000 中就已经存在了架构,此时数据库用户和架构是隐式连接在一起的,每个数据库用户都是与该用户同名的架构的所有者。从 SQL Server 2005 开始,架构与用户分离,多个用户可以通过角色或 Windows 组成员关系拥有同一个架构。可删除用户而不删除相应架构中的对象。

User1

User2

User3

User4

Schema1

Y

Y

N

N

Schema2

N

Y

N

Y

Schema3

Y

N

Y

N

任何数据库主体都拥有一个或多个架构。可以通过查询 sys.schemas 视图获得列表。

sqlserver中的架构(schema)与所有者(owner)_第1张图片

2.6.2 预定义的架构

SQL Server 预定义了一些架构,他们与内置数据库用户和角色具有相同的名称。这些架构主要用于向后兼容性。如果没必要保留这些与固定数据库角色具有相同名称的架构,则可以删除它们。

不能修改或删除下列 4 个预定义的架构。

(1)dbo

dbo 是新创建的数据库的默认架构。dbo 架构由 dbo 用户帐户拥有。默认情况下,使用 CREATE USER 语句创建的用户的默认架构为 dbo。dbo 用户与 dbo 架构是不同的概念,分配了 dbo 架构的用户不继承 dbo 用户帐户的权限。

(2)sys

sys 是包含了系统对象的默认架构。系统的元数据、视图、函数等都包含于该架构中。

(3)guest

(4)INFORMATION_SCHEMA

SQL Server 提供了独立于系统表的元数据库视图,INFORMATION_SCHEMA 架构中包含的元数据视图符合 ISO 标准中的信息架构定义。

提示:

新建的数据库都是从 model 模型数据库复制而成的,因此,如果从 model 数据库中删除这些预定义的架构,它们就不会显示在新建的数据库中。

2.6.3 新建架构

任何架构都只能有一个所有者。但是,一个用户可以不拥有架构,也可以拥有多个架构。

新架构由以下数据库级别主体之一拥有:数据库用户、数据库角色或应用程序角色。 在架构内创建的对象由架构所有者拥有,这些对象在 sys.objects 中的 principal_id 为 NULL。 架构所包含对象的所有权可转让给任何数据库级主体,但架构所有者始终保留对该架构内对象的 CONTROL 权限。

在创建数据库对象时,如果您将某一有效的域主体(用户或组)指定为对象所有者,则该域主体将作为架构添加到数据库中。 这个新架构将为该域主体所拥有。

sqlserver中的架构(schema)与所有者(owner)_第2张图片

创建新的架构需要对数据库具有 CREATE SCHEMA 权限。

若要指定其他用户作为所创建架构的所有者,则调用方必须具有对该用户的 IMPERSONATE 权限。 如果指定一个数据库角色作为所有者,则调用方必须拥有该角色的成员身份或对该角色拥有 ALTER 权限。

2.6.4 默认架构

从 SQL Server 2005 开始,每个用户都拥有一个默认架构。可以使用 CREATE USER 或 ALTER USER 的 DEFAULT_SCHEMA 选项设置和更改默认架构。如果未定义 DEFAULT_SCHEMA,则数据库用户将使用 dbo 作为默认架构。

创建用户时,可以使用 WITH DEFAULT_SCHEMA 子句为其指定一个默认的架构。

如果用户具有默认架构,则将使用默认架构。如果用户不具有默认架构,但该用户是具有默认架构的组的成员,则将使用该组的默认架构。如果用户不具有默认架构而且是多个组的成员,则该用户的默认架构将是具有最低 principle_id 的 Windows 组的架构和一个显式设置的默认架构。(不可能将可用的默认架构之一显式选作首选架构。)如果不能为用户确定默认架构,则将使用 dbo 架构。

当使用部分名称来引用数据库对象时,SQL Server 首先在用户的默认架构中查找。如果在此处未找到该对象,则 SQL Server 其次将在 dbo 架构中查找。如果对象不在 dbo 架构中,则会返回一个错误。为了防止缺少架构名称而影响到查询的执行过程,推荐在引用对象时同时指定架构和对象名称。例如:

SELECT ProductID FROM Production.Product

2.9 所有者

2.9.1  架构的所有者

数据库中的表、视图、存储过程等都属于某一个架构,而每个架构具有唯一的所有者(Owner)。利用架构,用户不再是对象的直接所有者,所以可以从数据库中仅删除用户而不会删除对象。

数据库的用户可以拥有多个架构,这样可以更容易管理表、视图等对象。

架构的所有者可以是数据库用户、数据库角色和应用程序角色。例如,数据库角色 db_owner 是架构 db_owner 的所有者;数据库的用户 dbo 用户是架构 dbo 的所有者。

在删除所有者(用户、角色)时,必须确认这个安全主体不再拥有任何架构。否则无法删除这个安全主体。

2.9.2  修改架构

在架构创建之后,就不能修改架构的名称。必须删除架构,然后使用新名称创建一个新的架构。

如果需要要修改架构的所有者,或者需要修改它的权限,可以通过 SSMS 图形界面完成修改操作。在架构的属性窗口,指定一个新的架构所有者。也可以单击“搜索”按钮,搜索一个角色或用户。

sqlserver中的架构(schema)与所有者(owner)_第3张图片

在“搜索角色和用户”对话窗口,单击“浏览”即可显示所有的匹配对象。

sqlserver中的架构(schema)与所有者(owner)_第4张图片

T-SQL 语法示例如下:

ALTER AUTHORIZATION ON SCHEMA::[UserSchema1] TO [dbo]

2.9.3  将对象移动到新的架构

在移动对象到新的架构之前,需要确认该对象的依赖关系。依赖关系包括了依赖于该对象的其他对象,以及该对象所依赖的其他对象。

sqlserver中的架构(schema)与所有者(owner)_第5张图片

如果需要将对象移动到另一个架构,在 SSMS 中右键单击某个对象(例如,表),然后从右键菜单中选择“设计”。在设计该对象时,从其“属性”窗口中通过下拉列表选择一个新的架构。

sqlserver中的架构(schema)与所有者(owner)_第6张图片

T-SQL 语法使用 ALTER SCHEMA 以及 TRANSFER 关键字。考虑到此操作可能引发大量的操作,因此需要使用事务。

BEGIN TRANSACTION
GO
ALTER SCHEMA UserSchema1 TRANSFER dbo.Table_1 
GO
ALTER TABLE UserSchema1.Table_1 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

参考

SQL Server 用户指南

SQL Server 用户指南

你可能感兴趣的:(SQLServer,架构,sqlserver,架构,数据库)