侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

SQL Server查看login所授予的具体权限问题

数据库  /  管理员 发布于 5年前   395

在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 1Database '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 #databasesSELECT database_id ,    nameFROM  sys.databasesWHERE 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.denyloginFROM  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.nameWHERE l.name=@login_nameORDER BY u.name,g.name;WHILE 1= 1BEGIN  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_rolesSELECT 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_IDWHERE 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.NAMEAS  [OBJECT_NAME]   , SYS.DATABASE_PRINCIPALS.NAME AS  [USER_NAME]   , dp.TYPEAS  [PERMISSIONS_TYPE]   , dp.PERMISSION_NAME      AS  [PERMISSION_NAME]   , dp.STATE           AS  [PERMISSION_STATE]   , dp.CLASS_DESC         AS  [CLASS_DESC]   , sc.nameAS  [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 dpLEFT 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_idWHERE SYS.DATABASE_PRINCIPALS.NAME =@p_login_nameORDER 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;ENDSELECT * 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所授予的具体权限问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    C# ling to sql 取多条记录最大时间
    下一条:
    行转列之SQL SERVER PIVOT与用法详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客