SQL Server查看login所授予的具体权限问题
作者:潇湘隐者 发布时间:2024-01-22 11:39:14
标签:sql,login,权限
在SQL Server数据库中如何查看一个登录名(login)的具体权限呢,如果使用SSMS的UI界面查看登录名的具体权限的话,用户数据库非常多的话,要梳理完它所有的权限,操作又耗时又麻烦,个人十分崇尚简洁、高效的方法,反感那些需要大量手工操作的UI界面操作方式,哪怕就是脚本,如果不能一次搞定,手工多操作几次(例如,切换数据库),都是不可接受的。最近遇到这个需求,就完善了一下之前的脚本get_login_rights_script.sql,输入登录名参数,将这个登录名所拥有的服务器角色、数据库角色、以及所授予具体对象的相关权限使用脚本查询出来,脚本分享如下:
--==================================================================================================================
-- ScriptName : get_login_rights_script.sql
-- Author : 潇湘隐者
-- CreateDate : 2015-12-18
-- Description : 查看某个登录名被授予的数据库对象的权限的脚本(授权脚本和回收权限脚本)
-- Note :
/******************************************************************************************************************
Parameters : 参数说明
********************************************************************************************************************
@login_name : 你要查看权限的登录名(需要输入替换的参数)
********************************************************************************************************************
Modified Date Modified User Version Modified Reason
********************************************************************************************************************
2018-08-03 潇湘隐者 V01.00.00 新建该脚本。
2019-04-04 潇湘隐者 V01.01.00 Fix掉一个bug,某个表只允许更新某个字段,但是这里显示更新整个表。
2019-09-25 潇湘隐者 V01.02.00 解决只能查看某个用户数据库,不能查看所有数据库的权限问题。
2019-09-25 潇湘隐者 V01.03.00 解决数据库名包含中划线[-], 出现下面错误问题
-------------------------------------------------------------------------------------------------------------------
Msg 911, Level 16, State 1, Line 1
Database 'xxxx' does not exist. Make sure that the name is entered correctly.
-------------------------------------------------------------------------------------------------------------------
*******************************************************************************************************************/
DECLARE @login_name NVARCHAR(32)= 'test1';
DECLARE @database_name NVARCHAR(64);
DECLARE @cmdText NVARCHAR(MAX);
IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
DROP TABLE dbo.#databases;
CREATE TABLE #databases
(
database_id INT,
database_name sysname
);
IF OBJECT_ID('tempdb.dbo.#user_db_roles') IS NOT NULL
DROP TABLE dbo.#user_db_roles;
CREATE TABLE dbo.#user_db_roles
(
[DB_NAME] NVARCHAR(64)
,[USER_NAME] NVARCHAR(64)
,[ROLE_NAME] NVARCHAR(64)
);
IF OBJECT_ID('tempdb.dbo.#user_object_rights') IS NOT NULL
DROP TABLE dbo.#user_object_rights;
CREATE TABLE dbo.#user_object_rights
(
[DATABASE_NAME] NVARCHAR(128),
[SCHEMA_NAME] NVARCHAR(64),
[OBJECT_NAME] NVARCHAR(128),
[USER_NAME] NVARCHAR(32),
[PERMISSIONS_TYPE] CHAR(12),
[PERMISSION_NAME] NVARCHAR(128),
[PERMISSION_STATE] NVARCHAR(64),
[CLASS_DESC] NVARCHAR(64),
[COLUMN_NAME] NVARCHAR(32),
[STATE_DESC] NVARCHAR(64),
[GRANT_STMT] NVARCHAR(MAX),
[REVOKE_STMT] NVARCHAR(MAX)
)
INSERT INTO #databases
SELECT database_id ,
name
FROM sys.databases
WHERE name NOT IN ('model') AND state = 0; --state_desc=ONLINE
--登录名授予的服务器角色
SELECT UserName = u.name ,
ServerRole = g.name ,
Type = u.type,
Type_Desc = u.Type_Desc,
Create_Date = u.create_date,
Modify_Date = u.modify_date,
DenyLogin = l.denylogin
FROM sys.server_role_members m
INNER JOIN sys.server_principals g ON g.principal_id = m.role_principal_id
INNER JOIN sys.server_principals u ON u.principal_id = m.member_principal_id
INNER JOIN sys.syslogins l ON u.name = l.name
WHERE l.name=@login_name
ORDER BY u.name,g.name;
WHILE 1= 1
BEGIN
SELECT TOP 1 @database_name= database_name
FROM #databases
ORDER BY database_id;
IF @@ROWCOUNT =0
BREAK;
SET @cmdText = N'USE ' + QUOTENAME(@database_name) + N';' +CHAR(10)
--登录名授予的数据库角色
SELECT @cmdText += N'INSERT INTO #user_db_roles
SELECT DB_NAME() AS [DB_NAME]
,M.NAME AS [USER_NAME]
,R.NAME AS [ROLE_NAME]
FROM sys.DATABASE_ROLE_MEMBERS RM
INNER JOIN sys.DATABASE_PRINCIPALS R ON RM.ROLE_PRINCIPAL_ID = R.PRINCIPAL_ID
INNER JOIN sys.DATABASE_PRINCIPALS M ON RM.MEMBER_PRINCIPAL_ID = M.PRINCIPAL_ID
WHERE M.NAME=@p_login_name' + CHAR(10);
EXEC SP_EXECUTESQL @cmdText, N'@p_login_name NVARCHAR(32)',@p_login_name=@login_name;
SET @cmdText = N'USE ' +QUOTENAME(@database_name) + N';' +CHAR(10);
--查看具体对象的授权问题
SELECT @cmdText +=N'INSERT INTO dbo.#user_object_rights
( [DATABASE_NAME] ,
[SCHEMA_NAME] ,
[OBJECT_NAME] ,
[USER_NAME] ,
[PERMISSIONS_TYPE] ,
[PERMISSION_NAME] ,
[PERMISSION_STATE] ,
[CLASS_DESC] ,
[COLUMN_NAME] ,
[STATE_DESC] ,
[GRANT_STMT] ,
[REVOKE_STMT]
)
SELECT DB_NAME() AS [DATABASE_NAME]
, SYS.SCHEMAS.NAME AS [SCHEMA_NAME]
, ob.NAME AS [OBJECT_NAME]
, SYS.DATABASE_PRINCIPALS.NAME AS [USER_NAME]
, dp.TYPE AS [PERMISSIONS_TYPE]
, dp.PERMISSION_NAME AS [PERMISSION_NAME]
, dp.STATE AS [PERMISSION_STATE]
, dp.CLASS_DESC AS [CLASS_DESC]
, sc.name AS [COLUMN_NAME]
, dp.STATE_DESC AS [STATE_DESC]
, dp.STATE_DESC + '' '' + dp.PERMISSION_NAME + '' ON [''+ SYS.SCHEMAS.NAME + ''].['' + ob.NAME + ''] TO ['' + SYS.DATABASE_PRINCIPALS.NAME + ''];'' COLLATE LATIN1_GENERAL_CI_AS
AS [GRANT_STMT]
, ''REVOKE '' + dp.PERMISSION_NAME + '' ON [''+ SYS.SCHEMAS.NAME + ''].['' + ob.NAME + ''] FROM ['' + SYS.DATABASE_PRINCIPALS.NAME + ''];'' COLLATE LATIN1_GENERAL_CI_AS
AS [REVOKE_STMT]
FROM SYS.DATABASE_PERMISSIONS dp
LEFT OUTER JOIN SYS.OBJECTS ob ON dp.MAJOR_ID = ob.OBJECT_ID
LEFT OUTER JOIN SYS.SCHEMAS ON ob.SCHEMA_ID = SYS.SCHEMAS.SCHEMA_ID
LEFT OUTER JOIN SYS.DATABASE_PRINCIPALS ON dp.GRANTEE_PRINCIPAL_ID = SYS.DATABASE_PRINCIPALS.PRINCIPAL_ID
LEFT OUTER JOIN SYS.columns sc ON ob.object_id = sc.object_id AND sc.column_id = dp.minor_id
WHERE SYS.DATABASE_PRINCIPALS.NAME =@p_login_name
ORDER BY PERMISSIONS_TYPE;'
PRINT(@cmdText);
EXEC SP_EXECUTESQL @cmdText, N'@p_login_name NVARCHAR(32)',@p_login_name=@login_name;
DELETE FROM #databases WHERE database_name=@database_name;
END
SELECT * FROM tempdb.dbo.#user_db_roles;
SELECT * FROM dbo.#user_object_rights;
IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
DROP TABLE dbo.#databases;
IF OBJECT_ID('tempdb.dbo.#user_db_roles') IS NOT NULL
DROP TABLE dbo.#user_db_roles;
IF OBJECT_ID('tempdb.dbo.#user_object_rights') IS NOT NULL
DROP TABLE dbo.#user_object_rights;
总结
以上所述是小编给大家介绍的SQL Server查看login所授予的具体权限问题,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/kerrycode/archive/2019/09/25/11588227.html
0
投稿
猜你喜欢
- 有一组4096长度的数据,需要找到一阶导数从正到负的点,和三阶导数从负到正的点,截取了一小段。394.0 388.0 389.0 388.0
- 在实际数据分析过程中,我们分析用Python来处理数据(海量的数据),我们都是把这个数据转换为Python的对象的,比如最为常见的字典。比如
- 一、概念1、模块化代码可以使代码易于维护和调试,并且提高代码的重用性;2、函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块
- myisam_max_[extra]_sort_file_size足够大 delay_key_write减少io,提高写入性能 bulk_i
- 为什么在facebook交友会更容易?facebook与传统的BSP(Blog Service Provider)到底有什么不同?是因为它有
- 概述在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)
- 我就废话不多说了,还是直接上代码吧!import osimport xml.dom.minidomimport cv2 as cvImgPa
- 作为一个运维开发,不像业务开发只专注后端业务开发即可,常常需要自己来构建前端的东西,当然系统交互体验说的过去就行,要求也没有业务系统那么高。
- 栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括empty()&n
- 前言如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。starting the server失败,通常是因为上次安装的该软
- 本文给出了本人在使用 Sublime Text 配置 Python 环境的记录。主要为了解决中文乱码的问题以及 Sublime Text 默
- System.Data.OleDb.OleDbDataAdapter与System.Data.OleDb.OleDbDataReader的区
- 摘要在机器视觉中,对于图像的处理有时候因为放置的原因导致ROI区域倾斜,这个时候我们会想办法把它纠正为正确的角度视角来,方便下一步的布局分析
- 本文实例为大家分享了python代码实现猜拳小游戏的具体代码,供大家参考,具体内容如下游戏实现具体功能原有的用户登录的信息均能保存在txt文
- 现在的页面上有许多各种各样的页面效果,常用的有弹出层效果,无缝滚动效果,选项卡切换效果。今天分享一款自己用原生javascript写的选项卡
- 本文实例分析了GO语言文件的创建与打开用法。分享给大家供大家参考。具体分析如下:文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是
- 如下:counter.htm<a href=counter.asp?save=123&url=http://127.0.0
- 目录项目场景:解决方案:概要描述:详细说明:总结:项目场景:使用FreeSql,包含所有的ORM数据库,都会存在这样的问题。在codefir
- 一、需求在管理数据库过程中,我们经常需要控制某个用户访问数据库的权限,比如只需要给这个用户访问某个表的权限,甚至是CRUD的权限,更小粒度的
- 利用python pyheatmap包绘制热力图,供大家参考,具体内容如下import matplotlib.pyplot as pltfr