本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第2章,第2.5节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.5 架构管理
锋利的SQL(第2版)
前面提过,架构是数据库中对象的容器,对于被集体管理的对象子集,通过架构可以简化操作。用户拥有架构和默认架构DBO,默认架构用于解析未使用其完全限定名称引用的对象的名称。这里的意思是,在访问默认架构中的对象时,不需要指定架构的名称。而对于非默认架构,则需要使用下面的格式进行访问,不过,微软建议你一直使用下面的两部分式对象名称。
架构名称.对象名称
2.5.1 创建架构
可以使用CREATE SCHEMA语句创建架构,语法格式如下所示。其中的schema_element部分允许使用CREATE TABLE、CREATE VIEW、GRANT、REVOKE和DENY语句来定义此架构包含的表和视图,并可对单个语句中的任何安全对象授予、撤销或拒绝授予权限。
CREATE SCHEMA schema_name_clause [ <schema_element> [ , ...n ] ]
<schema_name_clause> ::=
{
schema_name
| AUTHORIZATION owner_name
| schema_name AUTHORIZATION owner_name
}
<schema_element> ::=
{
table_definition | view_definition | grant_statement
revoke_statement | deny_statement
}
schema_name
在数据库内标识架构的名称,最大长度是128个字符。
AUTHORIZATION owner_name
指定将拥有架构的数据库级主体的名称。此主体还可以拥有其他架构,并且可以不使用当前架构作为其默认架构。
table_definition
指定在架构内创建表的CREATE TABLE语句。
view_definition
指定在架构内创建视图的CREATE VIEW语句。
grant_statement
指定可对除新架构外的任何安全对象授予权限的GRANT语句。
revoke_statement
指定可对除新架构外的任何安全对象撤销权限的REVOKE语句。
deny_statement
指定可对除新架构外的任何安全对象拒绝授予权限的DENY语句。
例如,下面的语句将建立一个名为Employees的架构,所有者为dbo。
CREATE SCHEMA Employees AUTHORIZATION dbo
又如,下面的语句创建由Annik拥有的、包含表NineProngs的Sprockets架构。此语句向Mandar授予SELECT权限,而对Prasanna拒绝授予SELECT权限。
USE AdventureWorks2014;
GO
CREATE SCHEMA Sprockets AUTHORIZATION Annik
CREATE TABLE NineProngs (source int, cost int, partnumber int)
GRANT SELECT TO Mandar
DENY SELECT TO Prasanna;
GO
2.5.2 修改架构
在创建一个架构后,可以根据需要使用GRANT、REVOKE、DENY语句对数据库用户进行授予、撤销授予、拒绝权限设置。虽然我们这本书是讲解SQL的,但是对于此操作,使用SQL Server Management Studio会更方便一些,步骤如下。
在对象资源管理器中,展开数据库引擎实例。
展开“数据库”节点,从中选择一个数据库并展开。
展开数据库的“安全性”节点后,继续展开“架构”节点,右键单击要修改的架构并选择“属性”,打开架构的属性窗口。
在架构的属性窗口的“常规”页面中,可以指定架构的名称和所有者。要查找一个有效的数据库级主体,可以单击“搜索”按钮。
可以在架构的属性窗口的“权限”页面中设置架构的权限,步骤如下。
在“权限”页面中单击“添加”按钮打开“选择用户或角色”对话框。
在“选择用户或角色”对话框的编辑框中输入要选择的用户或角色名称,并使用分号将名称分割开。如图2-3所示。
在添加完用户或角色后,可以为其指定详细的权限设置,如图2-4所示。
下面的语句把对架构HumanResources的INSERT权限授予Guest用户。
GRANT INSERT ON SCHEMA :: HumanResources TO guest;
下面的语句则是撤销Guest用户的INSERT权限。
REVOKE INSERT ON SCHEMA :: HumanResources TO guest;
2.5.3 移动对象到一个新架构中
在某些时候,可能需要移动对象到另一个容器中。但是,只能将对象在同一数据库之内的架构之间移动,在移动时,将会改变与对象相关联的命名空间。因此,也将改变对象的查询和访问方法。
将对象移入新架构时,将删除与该对象关联的全部权限。如果已显式设置对象所有者,则该所有者保持不变。移动对象应当使用ALTER SCHEMA语句,语法格式如下:
ALTER SCHEMA schema_name TRANSFER object_name;
schema_name
当前数据库中的架构名称,对象将移入其中。
object_name
要移入架构的对象名称。
下面的语句将表Address从架构Person移动到HumanResources架构中。
ALTER SCHEMA HumanResources TRANSFER Person.Address ;
2.5.4 删除架构
可以使用DROP SCHEMA语句删除架构。要删除的架构不能包含任何对象。例如,下面的语句将删除Employees架构:
DROP SCHEMA Employees ;
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。