时间:2021-07-01 10:21:17 帮助过:2人阅读
--让 SQL Server 登陆帐户“dba”访问多个数据库 use mydb2 go create user dba for login dba with default_schema=dbo go exec sp_addrolemember ‘db_owner‘, ‘dba‘ go
此时,dba 就可以有两个数据库 mydb, mydb2 的管理权限了!
下面一个实例来说明在sqlserver中如何使用存储过程创建角色,重建登录,以及如何为登录授权等问题。
/*--示例说明 示例在数据库InsideTSQL2008中创建一个拥有表HR.Employees的所有权限、拥有表Sales.Orders的SELECT权限的角色r_test 随后创建了一个登录l_test,然后在数据库InsideTSQL2008中为登录l_test创建了用户账户u_test 同时将用户账户u_test添加到角色r_test中,使其通过权限继承获取了与角色r_test一样的权限 最后使用DENY语句拒绝了用户账户u_test对表HR.Employees的SELECT权限。 经过这样的处理,使用l_test登录SQL Server实例后,它只具有表Sales.Orders的select权限和对表HR.Employees出select外的所有权限。 --*/ USE InsideTSQL2008 --创建角色 r_test EXEC sp_addrole ‘r_test‘ --添加登录 l_test,设置密码为pwd,默认数据库为pubs EXEC sp_addlogin ‘l_test‘,‘a@cd123‘,‘InsideTSQL2008‘ --为登录 l_test 在数据库 pubs 中添加安全账户 u_test EXEC sp_grantdbaccess ‘l_test‘,‘u_test‘ --添加 u_test 为角色 r_test 的成员 EXEC sp_addrolemember ‘r_test‘,‘u_test‘ --用l_test登陆,发现在SSMS中找不到仍和表,因此执行下述两条语句出错。 select * from Sales.Orders select * from HR.Employees --授予角色 r_test 对 HR.Employees 表的所有权限 GRANT ALL ON HR.Employees TO r_test --The ALL permission is deprecated and maintained only for compatibility. --It DOES NOT imply ALL permissions defined on the entity. --ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。 --测试可以查询表HR.Employees,但是Sales.Orders无法查询 select * from HR.Employees --如果要收回权限,可以使用如下语句。(可选择执行) revoke all on HR.Employees from r_test --ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。 --授予角色 r_test 对 Sales.Orders 表的 SELECT 权限 GRANT SELECT ON Sales.Orders TO r_test --用l_test登陆,发现可以查询Sales.Orders和HR.Employees两张表 select * from Sales.Orders select * from HR.Employees --拒绝安全账户 u_test 对 HR.Employees 表的 SELECT 权限 DENY SELECT ON HR.Employees TO u_test --再次执行查询HR.Employees表的语句,提示:拒绝了对对象 ‘Employees‘ (数据库 ‘InsideTSQL2008‘,架构 ‘HR‘)的 SELECT 权限。 select * from HR.Employees --重新授权 GRANT SELECT ON HR.Employees TO u_test --再次查询,可以查询出结果。 select * from HR.Employees USE InsideTSQL2008 --从数据库中删除安全账户,failed EXEC sp_revokedbaccess ‘u_test‘ --删除角色 r_test,failed EXEC sp_droprole ‘r_test‘ --删除登录 l_test,success EXEC sp_droplogin ‘l_test‘
revoke:收回之前被授予的权限
deny:拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。比如UserA所在的角色组有inset权限,但是我们Deny UserA使其没有insert权限,那么以后即使UserA再怎么到其他含有Insert的角色组中去,还是没有insert权限,除非该用户被显示授权。
简单来说,deny就是将来都不许给,revoke就是收回已经给予的。
GRANT INSERT ON TableA TO RoleA GO EXEC sp_addrolemember RoleA, ‘UserA‘ -- 用户UserA将有TableA的INSERT权限 GO REVOKE INSERT ON TableA FROM RoleA -- 用户UserA将没有TableA的INSERT权限,收回权限 GO GRANT INSERT ON TableA TORoleA --重新给RoleA以TableA的INSERT权限 GO DENY INSERT ON TableA TO UserA -- 虽然用户UserA所在RoleA有TableA的INSERT权限,但UserA本身被DENY了,所以用户UserA将没有TableA的INSERT权限。
在SQL Server中创建用户角色及授权
标签: