权限赋予

来源:互联网 发布:js sort 排序 编辑:程序博客网 时间:2024/04/27 21:55

MSSQL中权限存在三种方式

1、login设置server roles

2、user设置user roles

3、user通过gant/deny对DBobject进行一一权限授予或拒绝

第一种方式一般我们在给予一个login高权限时使用,比如我们要授予一个用户sa级别权限可以使用

EXEC master..sp_addsrvrolemember @loginame = N'LoginName', @rolename = N'sysadmin'

第二种方式是最常用的授权方式,该方式统一简洁容易管理,是推荐的办法。

如下面,我们给予了用户对当前DB 的读写权限

use DBName                             goIF not EXISTS(SELECT TOp 1 *FROM sys.sysusersWHERE name = 'UserName')BEGINEXEC('create user UserName   for login LoginName  ')EXEC('EXEC sp_addrolemember ''db_datareader'',UserName  ')end

常用role为

db_datareader --对当前数据库对象的只读权限db_datawriter --对当前数据库对象的写权限db_owner --数据库所有者,对当前DB对象的全部操作权限

我们可以通过一下脚本查看当前DB中所有用户拥有的对象,以及对应的LoginName

use DBName goselect  DBRole = g.name, MemberName = u.name,LoginName=t1.name From sys.database_principals u with(nolock),       sys.database_principals g with(nolock),       sys.database_role_members m with(nolock),  sys.server_principals t1 with(nolock) Where g.principal_id = m.role_principal_id And u.principal_id = m.member_principal_id and u.sid=t1.sid 

该方式存在的缺陷为,除了db_owner外,其他角色并不能得到执行sp/funcation的权限,而给予db_owner用户权限又会大。


第三种方式也是一种常见的授权方式 ,但一般都仅正对需要对单独DB 对象做权限控制的时候时候 ,比如同步链的目的端就应该禁止管理员以外的人手动更改,否则会出现同步错误,这是该方法就发挥作用了
--允许/拒绝表的单独权限给用户grant/DENY INSERT,UPDATE,DELETE ON TBName TO UserName--给予用户某个具体的SP运行权限grant execute on SPName to UserName--给予用户对所有对象的查询权限grant select to UserName

第二 和第三种方法结合使用我们可以解决仅允许用户查询或运行SP 这样的权限需求
--例如: --step 1IF not EXISTS(SELECT TOp 1 *FROM sys.sql_loginsWHERE name = 'LoginName')BEGIN    CREATE LOGIN LoginName WITH PASSWORD = N'pwd',CHECK_policy = OFFend--step 2use DBName                             goIF not EXISTS(    SELECT TOp 1 *    FROM sys.sysusers    WHERE name = 'UserName')begincreate user userName for login  LoginNameEXEC sp_addrolemember 'db_datareader',UserNameend--step3grant execute to userName



原创粉丝点击