架构(Schema)是数据库对象(比如,Table,View,存储过程等)的容器,授予用户对Schema访问的权限,就是授予用户对Schema下所有object的访问权限。

一,架构(Schema)是数据库对象的容器

1,创建架构,指定数据库主体(database-level principal)为该架构的Owner

CREATE SCHEMA schema_name
AUTHORIZATION owner_name

2,改变数据库对象的架构名

执行alter schema命令只能在同一个数据库中转移数据库对象的schema,跟该表相关的权限配置都将被移除。

alter schema hr
transfer object::dbo.usres

二,授予用户访问Schema的权限

1,将Schema作为安全对象(Securable),授予用户访问Schema的权限

一旦用户能够访问Schema,就能访问架构(Schema)容纳的所有数据库对象。

GRANT permission  [ ,...n ] ON SCHEMA :: schema_name
TO database_principal [ ,...n ]
[ WITH GRANT OPTION ]

2,示例,授予用户或角色访问Schema的权限

GRANT INSERT
ON SCHEMA :: HumanResources
TO guest; GRANT SELECT
ON SCHEMA :: Person
TO WilJo
WITH GRANT OPTION;

三,schema的所有者

通过系统视图:sys.schemas 查看schema的所有者,在删除用户时,如果该用户是schema的所有者,那么在删除时,系统抛出错误:

Error: 15138 The database principal owns a schema in the database, and cannot be dropped.

通过命令,修改schema的所有者,把schema的所有者转移到dbo用户:

ALTER AUTHORIZATION
ON SCHEMA::SchemaName
TO dbo

四,特殊的shecma

在每个数据库中,都存在三个特殊的schema:dbo,sys 和 INFORMATION_SCHEMA:

  • dbo是数据库对象默认的schema,其owner是用户dbo;
  • guest:是schema,其owner是用户guest;
  • sys 和 INFORMATION_SCHEMA 是数据库引擎内部使用的schema,用户不能删除和修改,其Owner默认是用户sys和INFORMATION_SCHEMA;

五,真实经历

项目经理(PM)要求给某一个User 授予一个只读的权限,避免其对数据进行修改,影响数据库的数据,但是仅仅授予只读的权限不行,因为这个User还要执行一些查询,查询语句中包括临时表,表变量,变量,自定义数据类型等,所以,必须授予其Select 和 Execute的权限。

--Create Login
create login [domain\login_xxx]
from windows
with default_database=[HR_DataWarehouse]; --Create User
create user [domain\login_xxx]
from login [domain\login_xxx]
with default_schema=dbo; --Create role
create role DBReaderExecute_NoModify
AUTHORIZATION [domain\login_xxx]; --Add member to role
alter role DBReaderExecute_NoModify
add member [domain\login_xxx]; --Grant Permission
grant EXECUTE,SELECT
on schema::dbo
to DBReaderExecute_NoModify; grant EXECUTE,SELECT
on schema::hr
to DBReaderExecute_NoModify;

参考文档:

CREATE SCHEMA (Transact-SQL)

ALTER SCHEMA (Transact-SQL)

GRANT Schema Permissions (Transact-SQL)

最新文章

  1. .Net分布式异常报警系统-服务端站点管理
  2. Web分布式架构演变过程
  3. 使用response实现文件的下载
  4. POJ水题 1298
  5. Redis附加功能之Redis事务
  6. Leetcode#172 Fractorial Trailing Zero
  7. 通过ajax提交form表单
  8. PL/pgSQL学习笔记之一
  9. mysql设置连接等待时间(wait_timeout)
  10. Java 大数A+B
  11. 流API--流的迭代
  12. SpringCloud的服务消费者 (二):(rest+feign/ribbon)声明式访问注册的微服务
  13. dotnetcore http服务器研究(二)性能分析
  14. python练习小文章-文本爬虫
  15. java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下
  16. 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示
  17. 【转】C++ const 关键字总结
  18. 如何打jar包
  19. [Unity工具]嵌套Prefab
  20. android---笔记 AppContext extends Application

热门文章

  1. C#与C/C++的交互zz
  2. python 基础之数据类型
  3. network issue troubleshooting
  4. view的滑动冲突解决方案
  5. IntelliJ IDEA全键盘操作
  6. js判断浏览器是否为IE浏览器
  7. mac与windows通过ftp传输文件
  8. Xamarin的不归路-ios模拟器调整窗口大小
  9. Altium Designer之AD16在Win10系统下无法切换走线/布线模式的解决办法
  10. 下订单存储过程 - MYSQL