• SQLServer 维护脚本分享(04)服务器角色和数据库角色相关操作


    /*------------------------------------------------------------------------------------
                                    【服务器级别—服务器角色】
    ------------------------------------------------------------------------------------*/
    
    --    查看固定服务器角色(8个,不可增删,未包括public,每个用户都属于public服务器角色)
    EXEC sp_helpsrvrole
    EXEC sp_helpsrvrole @srvrolename = 'sysadmin'
    
    
    --    查看服务器角色所拥有的权限说明(服务器角色详细权限说明!)
    EXEC sp_srvrolepermission
    EXEC sp_srvrolepermission @srvrolename = 'sysadmin'
    
    
    --    判断某个登录账号是否拥有某个服务器角色(有则为1,否则为0)
    SELECT IS_SRVROLEMEMBER('sysadmin')
    SELECT IS_SRVROLEMEMBER('sysadmin','sa')
    
    
    --    服务器角色在 SQL Server 2012 中可以创建!~
    CREATE SERVER ROLE [ServerRoleKK]
    
    
    --    将登录名添加为某个服务器级角色的成员
    EXEC sp_addsrvrolemember @loginame= 'kk' ,@rolename = 'sysadmin' 
    
    
    --    从服务器级角色中删除 SQL Server 登录名或 Windows 用户或组
    EXEC sp_dropsrvrolemember @loginame = 'kk' ,@rolename = 'sysadmin'
    
    
    --    查看 服务器角色 和 成员 关系
    EXEC sp_helpsrvrolemember
    EXEC sp_helpsrvrolemember @srvrolename = 'sysadmin'
    
    
    --    查看 服务器角色 和 成员 关系(更详细)
    SELECT sp.name AS [login_name]
    ,CASE WHEN sp.[type]='S' THEN 'SQL 登录名'  
        WHEN sp.[type]='U' THEN 'Windows 登录名'  
        WHEN sp.[type]='G' THEN 'Windows 组'  
        WHEN sp.[type]='R' THEN '服务器角色'  
        WHEN sp.[type]='C' THEN '映射到证书的登录名'  
        WHEN sp.[type]='K' THEN '映射到非对称密钥的登录名'  
    END AS [principal_type]
    ,sp.is_disabled
    ,ISNULL(sp.default_database_name,'') as [default_database_name]
    ,ISNULL(rsp.name,'') AS [server_role]  
    ,STUFF((SELECT ','+permission_name FROM sys.server_permissions spp where sp.principal_id=spp.grantee_principal_id for xml path('')),1,1,'') as [permissions]
    FROM sys.server_principals sp   
    LEFT JOIN sys.server_role_members srm ON sp.principal_id=srm.member_principal_id   
    LEFT JOIN sys.server_principals rsp ON srm.role_principal_id=rsp.principal_id 
    ORDER BY [principal_type],sp.principal_id
    
    
    
    --    查看服务器对象权限控制情况
    SELECT sp1.principal_id AS grantor_principal_id,sp1.name AS grantor_name,sp1.type_desc AS grantor_type_desc
    ,sp2.principal_id AS grantee_principal_id,sp2.name AS grantee_name,sp2.type_desc AS grantee_type_desc
    ,spe.class_desc,spe.state_desc,spe.permission_name
    FROM sys.server_principals sp1
    INNER JOIN sys.server_permissions spe ON sp1.principal_id=spe.grantor_principal_id
    INNER JOIN sys.server_principals sp2 ON sp2.principal_id=spe.grantee_principal_id
    
    
    
    --对于服务器级别权限控制更改:安全性——>登录名——右键登录账号——>属性——>安全对象——>搜索(有服务器/端点/登录名)——>下方控制权限
    
    
    
    ------------------------------------------------------------------------------------------------------------------------------------
    
    /*------------------------------------------------------------------------------------
                                    【数据库级别—数据库角色】
    ------------------------------------------------------------------------------------*/
    
    --    查看固定数据库角色(不包括public角色,每个数据库用户都属于 public 数据库角色)
    EXEC sp_helpdbfixedrole
    EXEC sp_helpdbfixedrole @rolename = 'db_owner'
    
    
    --    查看数据库角色所拥有的权限说明(数据库角色详细权限说明!)
    EXEC sp_dbfixedrolepermission
    EXEC sp_dbfixedrolepermission @rolename = 'db_owner'
    
    
    --    当前数据库中有关角色的信息(至少10个固定数据库角色)
    EXEC sp_helprole
    EXEC sp_helprole @rolename = 'db_owner'        --IsAppRole:是否应用程序角色
    
    
    --    某个角色的成员的信息
    EXEC sp_helprolemember
    EXEC sp_helprolemember @rolename = 'db_owner'
    
    
    --    当前用户是否为指定 Microsoft Windows 组或 SQL Server 数据库角色的成员
    SELECT IS_MEMBER('db_owner')
    
    
    --    创建数据库角色(如创建角色 Myrole 并拥有db_owner角色)
    CREATE ROLE MyRole AUTHORIZATION db_owner
    
    
    --    授予角色权限(当前数据库中将数据库角色授予 数据库用户、数据库角色、Windows登录名或Windows 组)
    EXEC sp_addrolemember @rolename= 'MyRole',@membername = 'MyUser'
    
    
    --    回收角色权限(当前数据库中将数据库角色回收,同上相反)
    EXEC sp_droprolemember @rolename= 'MyRole',@membername = 'MyUser'
    
    
    --    更改角色名称
    ALTER ROLE MyRole WITH NAME = NewRole
    
    
    --    删除角色
    DROP ROLE NewRole
    
    
    --    当前 数据库角色 与 用户 关系
    SELECT u.name as UserName,u.type_desc,u.default_schema_name,g.name as DBRole
    FROM sys.database_principals u
    inner join sys.database_role_members m on u.principal_id = m.member_principal_id
    inner join sys.database_principals g on g.principal_id = m.role_principal_id
    ORDER BY UserName,DBRole
    
    
    --对于数据库级别权限控制更改:某数据库——>安全性——角色——>数据库角色——>右键角色——>可自行添加成员
    
    
    -------------------------------------------------------------------------------------------------------------------
    
    --查看用户各对象的权限:
    
    SELECT pr.name,pe.state_desc,pe.permission_name,o.name,o.type_desc
    FROM sys.database_principals AS pr
    JOIN sys.database_permissions AS pe ON pe.grantee_principal_id = pr.principal_id
    JOIN sys.objects AS o ON pe.major_id = o.object_id
    WHERE pr.name = ''    --user_name
    AND o.name = '' --    object_name
    
    -------------------------------------------------------------------------------------------------------------------
    --系统中所有数据库授权情况:
    
    SELECT A.name,schema_name(A.schema_id) [schema],A.type,b.permission_name,B.type,B.state_desc,C.name,c.type_desc
    FROM sys.all_objects AS A  
    INNER JOIN sys.database_permissions AS B ON B.major_id=A.object_id AND B.minor_id=0 AND B.class=1  
    INNER JOIN sys.database_principals AS C ON C.principal_id = B.grantee_principal_id  
    ORDER BY A.name  
    
    -------------------------------------------------------------------------------------------------------------------
    --账户映射的数据库用户:
    SELECT isnull(s.name,'') as [login_name]
    ,isnull(s.default_database_name,'') as [default_database_name]
    ,u.name as [user_name]
    ,u.default_schema_name
    ,g.name as [database_role] 
    FROM sys.database_principals u  
    inner join sys.database_role_members m on u.principal_id = m.member_principal_id  
    inner join sys.database_principals g on g.principal_id = m.role_principal_id
    left join sys.server_principals s on u.sid = s.sid
    ORDER BY [login_name],[default_database_name],[database_role]  
    
    -------------------------------------------------------------------------------------------------------------------
    /*------------------------------------------------------------------------------------
                                    【数据库级别-应用程序角色】
    ------------------------------------------------------------------------------------*/
    
    /*应用程序角色是一个数据库主体,只能通过其他数据库中为 guest 授予的权限来访问这些数据库
    其他数据库中的应用程序角色将无法访问任何已禁用 guest 的数据库
    可以只允许通过特定应用程序连接的用户访问特定数据
    与数据库角色不同的是,应用程序角色默认情况下不包含任何成员,而且是非活动的
    启用应用程序角色需要密码
    应用程序角色无法访问服务器级元数据,若允许访问,需开启跟踪标志4616( DBCC TRACEON(4616,-1))*/
    
    
    --    创建应用程序角色
    CREATE APPLICATION ROLE [MyAppRole] WITH DEFAULT_SCHEMA = [dbo], PASSWORD = N'AppRole'
    
    
    --    更改应用程序角色的名称、密码或默认架构
    ALTER APPLICATION ROLE [MyAppRole] 
        WITH NAME = [AppRole],
        PASSWORD = 'AppRole',
        DEFAULT_SCHEMA = [dbo]
    
    
    --    激活与当前数据库中的应用程序角色关联的权限(不能在其他存储过程或用户定义事务中执行)
    DECLARE @cookie varbinary(8000)
    EXEC sp_setapprole 
      @rolename = 'AppRole'
    , @password = 'AppRole'
    --, @password = { encrypt N'AppRole' }    --ODBC encrypt 函数加密
    , @encrypt = 'none'                        --'none'|'odbc':是否模糊加密处理
    , @fCreateCookie = true                    -- true|false :是否创建 cookie
    , @cookie = @cookie OUTPUT                --获取应用程序角色之前安全上下文
    SELECT @cookie    --记住cookie
    
    
    --    查看当前登录用户(发现为 [AppRole])
    SELECT CURRENT_USER,USER_NAME()
    
    
    --    停用应用程序角色并恢复到前一个安全上下文(cookie 为sp_setapprole创建的)
    EXEC sp_unsetapprole @cookie = 0x5E76DB4EF3E20388C5CBDE4FEB63DC409BAAD344D11919EF23AF18743A8B40BBEB3F972E3D84C5F7FBE2C1A853934EBC0100
    
    
    --    删除应用程序角色
    DROP APPLICATION ROLE [AppRole]
    
    
    --    查看用程序角色
    SELECT * FROM sys.sysusers WHERE isapprole = 1
    
    -------------------------------------------------------------------------------------------------------------------
    --当前所有权限:
    select * from sys.fn_builtin_permissions(default)
  • 相关阅读:
    [转载]HashSet的存储机制
    Java基础加强
    [转载]JDK的动态代理深入解析(Proxy,InvocationHandler)
    Java语言基础Html
    Java语言基础JavaScript
    多线程数据与控制同步
    Expression Tree Basics表达式树基础
    调试优化利器ASP.NET 跟踪
    css position relative ,absolute ,float
    .net date /日期格式化
  • 原文地址:https://www.cnblogs.com/accumulater/p/6225469.html
Copyright © 2020-2023  润新知