SQL SERVER 架构管理
架构特点:
架构是数据库级的安全对象,是数据库中表、视图、存储过程等对象的容器,是形成单个命名空间的数据库实体的集合,一个架构只能有一个拥有者。
将所有权与架构分离的意义:
①架构所有权和架构范围内的安全对象可以转移,对象可以在架构之间转移
②一个用户可以拥有多个架构,多个数据库用户可以使用同一个默认架构
③使用架构,使得对架构和架构中对象的权限管理更加精细,用户在对架构对象进行操作时,不仅需要获得对对象操作的权限,还要获得对架构的操作权限
④架构可以由任何数据库主体拥有,如角色和应用程序角色等。可以删除数据库用户而不删除相应架构中的对象,删除用户并不会造成对架构和架构中对象的影响
架构管理
一、CREATE SCHEMA--------------------------------创建架构
CREATE SCHEMA <架构名子句> [<架构元素>[,.........n]]
<架构名子句>::={架构名|AUTHORIZATION 所有者名 |架构名 AUTHORIZATION 所有者名}
<架构元素>::={表定义语句|视图定义语句|授权语句|撤销授权语句|禁止授权语句}
注意:
①AUTHORIZATION指定数据库级别的主体(数据库用户,数据库角色,应用程序角色)作为架构拥有者,在架构内创建的对象由架构所有者拥有。架构所包含对象的所有权可转让给任何数据库级别的主体,但架构所有者始终保留对此架构内对象的CONTROL权限,若CREATE SCHEMA中未指定所有者,则由当前用户作为所有者。
②当前支持不指定架构名称的 CREATE SCHEMA 语句,目的是为了向后兼容。此类语句并不在数据库中实际创建架构,但它们会创建表和视图,并授予权限。主体不需要 CREATE SCHEMA 权限来执行这一早期形式的 CREATE SCHEMA,因为不会创建任何架构。在 SQL Server 的未来版本中将删除此功能。
③授权语句GRANT指定可对除新架构外的任何安全对象授予权限的 GRANT 语句。
撤销授权语句REVOKE指定可对除新架构外的任何安全对象撤消权限的 REVOKE 语句。
禁止授权语句DENY指定可对除新架构外的任何安全对象拒绝授予权限的 DENY 语句。
④CREATE SCHEMA 可以在单条语句中创建架构以及该架构所包含的表和视图,并授予对任何安全对象的 GRANT、REVOKE 或 DENY 权限。此语句必须作为一个单独的批处理执行。CREATE SCHEMA 语句所创建的对象将在要创建的架构内进行创建。
⑤GRANT 语句可以在创建某个对象自身之前对该对象授予权限,CREATE VIEW 语句也可以出现在创建该视图所引用表的 CREATE TABLE 语句之前。同样,CREATE TABLE 语句可以在 CREATE SCHEMA 语句定义表之前声明表的外键。
⑥支持在 CREATE SCHEMA 语句中使用 DENY 和 REVOKE。DENY 和 REVOKE 子句将按照它们在 CREATE SCHEMA 语句中出现的顺序执行。
⑦若要指定其他用户作为所创建架构的所有者,则调用方必须具有对该用户的 IMPERSONATE 权限。如果指定一个数据库角色作为所有者,则调用方必须拥有该角色的成员身份或对该角色拥有 ALTER 权限。
例如:
下面的示例将创建由 Annik 拥有的、包含表 NineProngs 的 Sprockets 架构。该语句向 Mandar 授予 SELECT 权限,而对 Prasanna 拒绝授予 SELECT 权限。请注意,Sprockets 和 NineProngs 在一个语句中创建。
CREATE SCHEMA Sprockets AUTHORIZATION Annik
CREATE TABLE NineProngs (source int, cost int, partnumber int)
GRANT SELECT ON SCHEMA::Sprockets TO Mandar
DENY SELECT ON SCHEMA::Sprockets TO Prasanna;
二、ALTER SCHEMA---------------------修改架构
ALTER SCHEMA 目标架构名 TRANSFER 原架构名.对象名
说明:修改架构即将架构中的对象转移到其他架构中,修改架构不会改变架构中的对象,但与该对象相关联的所有权限都被删除
如:ALTER SCHEMA S_YX TRANSFER DBO.T1
三、DROP SCHEMA------------------------删除架构
DROP SCHEMA 架构名
注意:只有当架构中不在包含对象时,才可以删除该架构。
四、ALTER AUTHORIZATION------------修改架构所有者
ALTER AUTHORIZATON ON [<实体类型>::] 实体名 TO {schema owner|主体名}
对象类型::={SCHEMA|ROLE|DATABASE...........}
ALTER AUTHORIZATION 不进可以修改架构所有者,也可以修改其他类型所有者
如:ALTER AUTHORIZATION ON SCHEMA::S_TY TO DBO