频道澳门葡京手机版网址
登录注册
澳门葡京手机版网址 > 数据库 > SQL Server > 正文
查询数据库账号的所有权限
2015-09-30 14:05:40         来源:SQL Server DBA  
收藏   我要投稿
在SQL Server数据库中,登录账号分类如下:

 

(1) SQL账号,需要单独设置密码,比如:sa;

 

(2) Windows账号,登录windows的账号,比如: administrator,不需要另设密码;

 

(3) Windows Group 账号, 为本地用户组或域用户组,将组添加到登录,组成员不需要单独创建登录;

 

查看Windows账号,是否属于某一个/多个用户组:

 

exec xp_logininfo 'windows_acount','ALL'  --域用户格式为:domain_name\account_name

以下脚本,均假设最终登录账号为:test_login,所有数据库对应的user为test_user 

 

一. 有没有权限

 

1. 检查有没有登录权限

 

--是否存在有效的登录账号:是否被禁用,sql login还有:密码是否过期,是否被锁定

select is_disabled, loginproperty(name,'Isexpired') is_expired, loginproperty(name,'Islocked') is_locked, * 

from sys.server_principals

where name = 'test_login'

 

2. 检查有没有访问某数据库的权限

 

USE DBA
GO

--检查是否有数据库的CONNECT权限即可
select b.* from sys.database_principals a
inner join sys.database_permissions b
on a.principal_id = b.grantee_principal_id
where SUSER_SNAME(a.sid) = 'test_login'
and b.permission_name = 'CONNECT'

--老的系统表sysusers也可以检查
SELECT name, hasdbaccess,* FROM sysusers a
WHERE SUSER_SNAME(a.sid) = 'test_login'

 

 

如果有很多个数据库,写个游标1个个去检查即可。

 

3. 检查有没有某个对象的权限

 

检查有没有某个对象的权限,一般是去尝试运行下脚本比较直观,如果去查各种权限表,角色错综复杂时,很难分辨;

 

SQL Server 2008之后引入了HAS_PERMS_BY_NAME这个函数,它可以检查当前账号的各种权限,检查其他用户需要用EXECUTE AS来切换:

 

 

USE DBA
GO
EXECUTE AS user = 'test_user'
GO
--对象权限
SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');
SELECT HAS_PERMS_BY_NAME('sp_send_dbmail', 'OBJECT', 'EXEC');
--架构权限
SELECT HAS_PERMS_BY_NAME('test_schema', 'SCHEMA', 'SELECT');
REVERT;
GO

 

对于是否有登录、访问数据库的权限,用这个函数也可以判断:

 

 

USE master
GO
EXECUTE AS login = 'test_login'
GO
--登录权限,本机前2个参数为空即可
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'CONNECT SQL');
REVERT;
GO

USE DBA
GO
EXECUTE AS user = 'test_user'
GO
--数据库权限
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CONNECT');
REVERT;

 

二. 有哪些权限

 

权限可以直接分配给账号,也可以分配给账号所属的role,所以要把账号自身权限、所属role权限合并才是最终的账号权限。

 

Windows账号权限还可以通过用户组分配,所以还要检查这个Windows账号有没有属于某个用户组,如果有还需要加上这个用户组的权限;

 

下面的脚本,仅检查单个用户/用户组权限。

 

1. 实例级的权限

 

 Instance-Level Permissions

注意:服务器角色的权限可以做什么具体的事情,exec sp_srvrolepermission 有大致的先容,但是也并没有全部列出每一种数据库操作,因为有些操作是被更高级的操作包含的。

 

2. 数据库级的权限

 

仅列出数据库级别的权限,具体的对象名称并没有列出。

 

 Database-Level Permissions

注意:sysadmin的账号在数据库里可能并没有做映射,但权限是有的,隐式映射的用户是dbo

 

3. 对象级的权限

 

sys.database_permissions有很多对象类型,major_id, minor_id取决于class_desc,不同的对象关联不同的系统表/视图,脚本里仅列出了最常见的OBJECT_OR_COLUMN, SCHEMA对象权限。

 

Object-Level Permissions

注意:如果对象的权限是通过role衍生的,而不是直接分配给user或者role,那么并不会被列出来。试想sysadmin 的角色,难道要列出所有数据库的所有对象吗?

 

三. 查看自己的权限

 

1. 有没有登录权限

 

登录失败并不一定是没权限,还是找别人来检查自己账号的登录权限吧;

 

2. 有没有数据库访问权限

 

--列出所有可访问的数据库
SELECT *
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1

 

 

3. 有没有对象访问权限

 

用上面提到HAS_PERMS_BY_NAME函数,它可以检查当前账号的各种权限;

 

SELECT HAS_PERMS_BY_NAME('test_sp', 'Object' , 'Execute')

SELECT HAS_PERMS_BY_NAME('test', 'Database' , 'Execute')

 

4. 有哪些权限

 

--实例级权限
SELECT * FROM fn_my_permissions(NULL, 'SERVER'); 
--数据库级权限
SELECT * FROM fn_my_permissions ('DBA', 'DATABASE'); 
--对象权限,只能一个个对象检查,不能一次返回所有对象权限,和HAS_PERMS_BY_NAME类似
SELECT * FROM fn_my_permissions ('test_grant', 'OBJECT'); 

 

 

 用于检查自己权限的方法,同样也可以检查其他账号,用EXECUTE AS切换账号即可。

点击复制链接 与好友分享!回澳门葡京手机版网址澳门葡京手机版网址
相关TAG标签 账号 权限 数据库
上一篇:MS SQL按IN()内容排序
下一篇:化繁为简——分解复杂的SQL语句
相关文章
图文推荐
点击排行

关于大家 | 联系大家 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 澳门葡京手机版网址_澳门新莆京娱乐_www.88807.com - 点此进入--致力于做实用的IT技术学习网站

XML 地图 | Sitemap 地图