- /* 权限、角色、架构 */
- 一、权限
- grant 用于授予用户操作TSQL语句的相应权限
- deny 用于拒绝用户操作TSQL语句的相应权限
- revoke 回收grant或deny授予的权限
- 可授予对象的权限有:
- select 检索数据、insert 插入数据、update 更新数据、delete 删除数据、
- references 外键引用、execute 运行存储过程
- create database 创建数据库
- 二、角色:角色的出现方便了对权限的管理,sqlserver中很多权限,不同权限的组合或单独就构成了角色。
- 数据库级别的角色
- db_owner 可以执行数据库的所有配置和维护活动,还可以删除数据库。
- db_securityadmin 可以修改角色成员身份和管理权限。向此角色中添加主体可能会导致意外的权限升级。
- db_accessadmin 可以为 Windows 登录名、Windows 组和 SQL Server 登录名添加或删除数据库访问权限。
- db_backupoperator 可以备份数据库。
- db_ddladmin 可以在数据库中运行任何数据定义语言 (DDL) 命令。
- db_datawriter 可以在所有用户表中添加、删除或更改数据。
- db_datareader 可以从所有用户表中读取所有数据。
- db_denydatawriter 不能添加、修改或删除数据库内用户表中的任何数据。
- db_denydatareader 不能读取数据库内用户表中的任何数据。
- 服务器角色
- sp_helpdbfixedrole 返回固定数据库角色的列表。
- sp_dbfixedrolepermission 显示固定数据库角色的权限。
- sp_helprole 返回当前数据库中有关角色的信息。
- sp_helprolemember 返回有关当前数据库中某个角色的成员的信息。
- sys.database_role_members 为每个数据库角色的每个成员返回一行。
- IS_MEMBER 指示当前用户是否为指定 Microsoft Windows 组或 Microsoft SQL Server 数据库角色的成员。
- CREATE ROLE 在当前数据库中创建新的数据库角色。
- ALTER ROLE 更改数据库角色的名称。
- DROP ROLE 命令从数据库中删除角色。
- sp_addrole 在当前数据库中创建新的数据库角色。
- sp_droprole 从当前数据库中删除数据库角色。
- sp_addrolemember 为当前数据库中的数据库角色添加数据库用户、数据库角色、Windows 登录名或 Windows 组。
- sp_droprolemember 从当前数据库的 SQL Server 角色中删除安全帐户。
- public数据库角色
- 每个数据库用户都是public角色的成员,如果未来向某个用户授予或拒绝对安全对象的特定权限时,
- 该用户将继续授予该对象的public角色的权限
- 默认情况下,数据库创建时就包含一个 guest 用户。授予 guest 用户的权限由在数据库中没有帐户的用户继承。
- guest 用户不能删除,但可以通过在 master 和 temp 以外的任何数据库中执行
- revoke connect from guest 来撤消该用户的 CONNECT 权限,从而禁用该用户。
- 三、架构Schema
- 数据库对象,指的是表、视图、存储过程、触发器等对象,对于不同的用户创建的数据库对象不可能放在一起,
- 于是出现了架构,就是一个个容器。
- 架构是单个命名空间的数据库实体的集合。命名空间是一个集合,其中 每个元素的名称都是唯一的。
- 架构Schema : 独立于数据库用户的非重复的命名空间。
- 用户u1创建表t1,用户u2创建表t2
- 用户u2访问情况是这样的
- select * from u1.t1 --默认情况下架构名为用户名
- select * from t2 --默认架构不用写 当前用户的默认架构为u2
- 用户(User)和架构(Schema)的关系
- 一个架构有且只有一个所有者Owner。
- 一个用户可以拥有多个架构。
- 创建一个用户,系统将自动创建一个同名的架构。
- 创建一个架构必须指定所有者,否则将默认为当前登陆用户。
- 表属于不同的架构也不能重名。
- 删除一个用户时,架构也会被删除?
- 用户与架构(Schema)分开,让数据库内各对象不再绑定到某个用户账号上,可以解决“用户离开公司”
- 默认架构:SQLServer2005引入了"默认架构"的概念,用于解析未使用其完全限定名称引用的对象的名称。
- 每个用户都有一个默认架,用于指定服务器解析对象的名称时将要搜索的第一个架可以使用create user和alter user的
- default_schema选项设置和更改默认架构。如果未定义default_schema,则数据库将把dbo作为其默认架
- 使用架构的优点:
- 1. 多 个用户可以通过角色(role)或组(Windows groups)成员关系拥有同一个架构。在2005中,每个数据库中的固定数据库角色都有一个属于 自己的架构,如果我们创建一个表,给它指定的架构名称为db_ddladmin,那么任何一个属于db_ddladmin中的用户都是可以去查询、修改和 删除属于这个架构中的表,但是其它不属于这个组的用户是不行的,有一点必须注意,db_dbdatareader组的成员可以查看所有数据库中的 表,db_dbdatawriter组成员可以修改所有数据库中的表,db_owner组成员可以对数据库所有表进行所有操作,这几个组的成员可以通过角 色获取到在数据库中的特殊权限。
- 2. 删除数据库用户变得极为简单。 在 SQL Server 2000 中,用户(User)和架构是隐含关联的,即每个用户拥有与其同名的架构。因此要删除一个用户,必须先删除或修改这 个用户所拥有的所有数据库对象,就比如一个员工要离职要删除他的账户的时候,还得将他所创建的表和视图等都删除,影响过大。将架构和对象者分离后就不在存 在这样的问题,删除用户的时候,对数据库对象是没有任何影响的。
- 3. 共享缺省架构使得开发人员可以为特定的应用程序创建特定的架构来存放对象,这比仅使用管理员架构(DBO schema)要好。
- 4. 在架构和架构所包含的对象上设置权限(permissions)比以前的版本拥有更高的可管理性。
- 5. 区分不同业务处理需要的对象,例如,我们可以把公共的表设置成pub的架构,把销售相关的设置为sales,这样管理和访问起来更容易.
- --------------------code----------------------------
- select * from sys.objects --name 对象名、object_id 对象id、schema_id 所属架构id
- select * from sys.schemas --name 架构名,schema_id 架构id
- --查询当前数据库中所有表或视图名及所属架构名
- select obj.name 对象名,sch.name 所属架构名
- from sys.objects obj,sys.schemas sch
- where obj.type='u' and obj.schema_id=sch.schema_id
- --创建登录名
- create login marry with password='password1111',default_database=accp
- --创建账号并指定默认架构
- create user mar for login marry with default_schema=accp
- --授予账号mar创建表的权限
- grant create table to mar
- --切换以账号mar登录
- execute as user='mar'
- --查看当前用户
- select current_user
- --创建表
- create table t1(temp int) --创建对象t1失败,因为默认的架构accp不存在
- --创建架构accp,并指定架构的所有者
- create schema accp authorization mar --没有权限,创建失败
- --重新切换到用户dbo
- revert
- --以dbo身份创建架构accp
- create schema accp authorization mar --这次成功
- --切换用户到mar
- execute as user='mar'
- --创建表
- create table t1(temp int) --成功
- --现在想删除用户mar,发现删除失败
- drop user mar
- --删除用户之前要删除其所有对象,或者将其的对象架构更改
- revert
- alter schema dbo transfer accp.t1 --1、更改表t1的架构名accp->dbo
- --查看对象的架构更改是否成功
- select * from accp.t1 --失败
- select * from dbo.t1 --成功
- --删除架构或更改用户的默认架构 拥有架构的账户不能删除
- drop schema accp --删除用户指定的默认加构
- --alter user mar with default_schema=dbo --列改默认架构
- --现在可以删除账号mar了
- drop user mar --成功
- --删除登录名 marry
- drop login marry --成功
- sys.user_token 为组成用户标记的每个数据库主体返回一行
- name:主体数据库的名称
- type:主体数据库类型的说明
- sql_user
- windows_user
- windows_group
- application_role
- database_role
- usage:参与的grant或deny权限 可以为grant|deny|authenticator
- select * from sys.user_token
- sys.login_token : 为登录名标记中包含的每个服务器主体返回一行
- name:服务器主体的名称
- type:服务器主体类型的说明
- sql_login
- windows_login
- windows_group
- server_role
- usage :同上
- select * from sys.login_token
- sys.server_principals : 每个服务器级别主体占一行
- name: 主体的名称
- type: 主体的类型
- s=sql登录名
- u=windows登录名
- g=windows组
- r=服务器角色
- type_desc : 主体类型的说明
- sql_login
- windows_login
- windows_group
- server_role
- is_disabled : 1=禁用登录名
- default_database_name:默认的数据库
- select * from sys.server_principals
- sys.database_principals : 为数据库中的每个主体返回一行
- name: 主体名称
- type: 主体类型
- s=sql用户
- u=windows用户
- g=windows组
- a=应用程序角色
- r=数据库角色
- type_desc:主体类型的说明
- sql_user
- windows_user
- windows_group
- database_role
- default_schema_name: 当SQL名称未指定架构时使用的名称
- 对于非s、u或a类型的主体,为null
- select * from sys.database_principals