如何为数据库中新建用户B复制用户A的表和视图权限?

news/2024/5/19 22:21:03
故事背景:

公司使用的是SQL Server数据库,经常会碰到一种情况,需要为新入职的员工赋予同组内其他同事的权限。

    常用方法:
  • 1) 为同一组申请创建统一的Security Group(安全组),为创建的组分配相关表和视图的访问权限。不管员工入职还是离职,仅需将组内的成员进行相关的添加和删除即可。
  • 2) 由于某些原因,如数据权限最小原则,员工A仅有数据库中某几张表和视图的查询权限。当员工A出现职位变动时,需要为接替者员工B赋予员工A的数据库访问权限。如果逐一给员工B添加相关表和视图的查询权限,则过程漫长,还有可能造成权限遗漏。

当前篇章我们主要详解第2种情况,应该怎样快速把数据库中员工A表和视图的查询权限快速赋予员工B呢?

解决方案:
1,在数据库中创建用户B(如果用户B的登录已存在,则只需创建映射用户B到该登录的数据库):
1 USE [ABC]; -- 切换到目标数据库
2 GO
3 
4 -- 假设B是数据库用户,不是登录名
5 CREATE USER [B] FOR LOGIN [B]; -- 如果B是Windows登录或其他类型登录,需要相应地更改
6 GO
2,将用户A表查询权限赋予用户B:

由于直接复制权限比较复杂,需要遍历所有表和视图,并且检查用户A被授予的SELECT权限。然后再把查到的用户A的表和视图权限赋予用户B。

以下是如何为用户B授予用户A的SELECT权限的示例代码:

1 USE [ABC]; -- 确保使用正确的数据库2 GO3 4 DECLARE @TableName NVARCHAR(256);5 DECLARE @SQL NVARCHAR(MAX) = '';6 7 -- 获取用户A在dbo架构下所有表和视图的SELECT权限,并构建授权语句8 DECLARE TableCursor CURSOR FOR9 SELECT QUOTENAME(t.name)
10 FROM sys.tables AS t
11 JOIN sys.database_permissions AS dp ON t.object_id = dp.major_id
12 WHERE dp.permission_name = 'SELECT' AND dp.grantee_principal_id = USER_ID('A') AND dp.class = 1
13 
14 OPEN TableCursor;
15 FETCH NEXT FROM TableCursor INTO @TableName;
16 
17 WHILE @@FETCH_STATUS = 0
18 BEGIN
19     SET @SQL = @SQL + 'GRANT SELECT ON ' + @TableName + ' TO [B];' + CHAR(13);
20     FETCH NEXT FROM TableCursor INTO @TableName;
21 END
22 
23 CLOSE TableCursor;
24 DEALLOCATE TableCursor;
25 
26 -- 执行构建的授权语句
27 EXEC sp_executesql @SQL;
28 GO
29 
30 -- 同上,为视图赋予权限
31 DECLARE ViewCursor CURSOR FOR
32 SELECT QUOTENAME(v.name)
33 FROM sys.views AS v
34 JOIN sys.database_permissions AS dp ON v.object_id = dp.major_id
35 WHERE dp.permission_name = 'SELECT' AND dp.grantee_principal_id = USER_ID('A') AND dp.class = 0
36 
37 OPEN ViewCursor;
38 FETCH NEXT FROM ViewCursor INTO @TableName;
39 
40 WHILE @@FETCH_STATUS = 0
41 BEGIN
42     SET @SQL = @SQL + 'GRANT SELECT ON ' + @TableName + ' TO [B];' + CHAR(13);
43     FETCH NEXT FROM ViewCursor INTO @TableName;
44 END
45 
46 CLOSE ViewCursor;
47 DEALLOCATE ViewCursor;
48 
49 EXEC sp_executesql @SQL;
50 GO

请注意,上述脚本使用了动态SQL来构建权限授予的语句,并对每个表和视图执行了授权。QUOTENAME函数用于确保表名和视图名被正确地引用,防止SQL注入。

此外,USER_ID('A')函数获取用户A的数据库主ID,dp.class = 1表示表(OBJECT),dp.class = 0表示视图(VIEW)。在实际应用中,你可能需要根据实际情况调整上述脚本,以确保正确地复制所需的权限。

在执行这些操作之前,请确保你具有足够的权限,并且了解这些操作的后果,因为它们可能会对数据库的安全性和访问控制产生重大影响。

今天分享就到这道,想了解更多小技巧,记得关注我哦!


http://www.mrgr.cn/p/41785077

相关文章

学习模型训练心得1

大模型时代,多年python开发人员,多多少少得了解模型训练这块,先从学习LLaMA-Factory开启吧!!! 地址:https://colab.research.google.com/drive/1d5KQtbemerlSDSxZIfAaWXhKr30QypiK?usp=sharing&pli=1#scrollTo=kbFsAE-y5so4 打开按步骤登录google账号,就可以一步一…

Python-VBA函数之旅-isinstance函数

目录 一、isinstance函数的常见应用场景: 二、isinstance函数使用注意事项: 三、如何用好isinstance函数? 1、isinstance函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页&#xff…

conda安装和使用

官网 https://www.anaconda.com/ 一、下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?C=M&O=D ubuntu系统下载 Miniconda3-latest-Linux-x86_64.sh 二、安装 执行以下安装 bash Miniconda3-py38_23.1.0-1-Linux-x86_64.sh 接下来,根据提示按enter或者…

JAVA学习14——异常

目录 异常: 1.异常基本介绍: 2.异常体系图: 3.五大运行时异常: (1)NullPointerException空指针异常: (2)AirthmetiException数字运算异常: &#xff0…

Docker 必知必会----初识

什么是Docker?Docker 是一个开源的容器管理引擎。开发者可以通过Docker直接管理应用程序所需要的容器。它的logo如下: 为什么需要Docker使用Docker主要有两个原因,1、屏蔽不同环境的硬件差异,减轻开发人员在不同环境上,为了适配环境差异所需要做的工作。如各项系统配置、…

Python中设计注册登录代码

import hashlib import json import os import sys # user interface 用户是界面 UI """ 用户登录系统 1.注册 2.登陆 0.退出 """ # 读取users.bin def load(path): return json.load(open(path, "rt")) # 保存user.bin def save(dic…

div组件作为按钮点击时显示小手样式

最近开发的时候发现用div来做按钮比直接使用el-button方便很多&#xff0c;调整样式也方便&#xff0c;但是如果直接使用div做按钮&#xff0c;鼠标放上面时只显示一个竖着的光标&#xff0c;很不美观&#xff0c;并且不会让用户知道可以点击 <template><div class&qu…

FTP协议与工作原理

一、FTP协议 FTP&#xff08;FileTransferProtocol&#xff09;文件传输协议&#xff1a;用于Internet上的控制文件的双向传输&#xff0c;是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的FTP应用程序&#xff0c;而所有这些应用程序都遵守同…

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

希望进行 Jira 迁移的企业,可以借助云效的项目协作平台 Projex 轻松实现研发流程的定制化、规范化和自动化。作者:天彤 Atlassian 在 2020 年官方发布公告,从 2021 年起停止 Jira Server 产品的销售,并且在 2024 年彻底停止 Server 端产品的服务支持,这对于国内使用 Jira …

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境&#xff1a; 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板&#xff0c;&#xff08;一时脑热买了两块 RK3568 开发板&#xff09;&#xff0c;Atompi-CA1 RK3568 开发板比较小巧&#xff0c;利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

docker - [13] docker网络

smo smo smo "狂神" omz omz omz 一、理解网络本机回环地址:127.0.0.1 本机IP地址:192.168.2.131 docker地址:172.17.0.11.1、docker如何处理容器网络访问的? 首先,拉取一个tomcat镜像(我直接从之前制作的tomcat镜像拉取下来了)拉取之后修改了一下名字:dock…

(VKL系列)超低功耗LCD液晶显示驱动IC-VKL76 SSOP28,19*4 76点阵,超低工作电流约7.5微安,适用水电表/温湿度计/温控器/传感器等,FAE技术支持

VKL076概述: VKL076是一个点阵式存储映射的LCD驱动器,可支持最大76点(19SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。 功能特…

44 网络基础

本章重点 了解网络发展背景&#xff0c;对局域网/广域网的概念有基本认识 了解网络协议的意义&#xff0c;重点理解TCP/IP五层结构模型 学习网络传输的基本流程&#xff0c;理解封装和分用 目录 1.网络发展 2.协议 3.OSI七层模型 4.TCP/IP五层模型 5.网络传输流程图 6.网络中…

(VKL系列)超低功耗LCD液晶显示驱动IC-VKL060 SSOP24,19*4 76点阵,超低工作电流约7.5微安,适用水电表/温湿度计/温控器/传感器等,FAE技术支持

VKL076概述: VKL076是一个点阵式存储映射的LCD驱动器,可支持最大76点(19SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。 功能特…

基于CLAHE算法的图像增强及评价

摘要&#xff1a; 本研究旨在探讨对比度限制自适应直方图均衡化&#xff08;CLAHE&#xff09;算法在数字图像处理中的应用。CLAHE算法通过在局部区域内进行直方图均衡化&#xff0c;有效地增强了图像的对比度&#xff0c;并在保持图像细节的同时避免了过度增强的问题。本文通过…

【承装修、试电力施工许可证申报指南】广西承装(修、试)电力设施许可证资质代办流程

【承装修、试电力施工许可证申报指南】广西承装(修、试)电力设施许可证资质代办流程 广西承装(修、试)电力设施许可证资质代办流程 在广西地区&#xff0c;承装、修、试电力设施许可证的资质代办流程相对复杂&#xff0c;但遵循一定的步骤和规定&#xff0c;可以确保流程的顺利…

Servlet相关知识(2)

HttpServletResponse类 HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用, HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息, 我们如果需要设置返回给客户端的信…

十日冲刺其十

今日完成:对于登录页面传值等问题进行修复遇到困难:出现 "No operations allowed after connection closed" 错误明日计划:实现各功能正常运行

npm install digital envelope routines::unsupported解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 执行命令 npm install 报错&#xff1a;digital envelope routines::unsupported 二、问题原因 Node.js 17 版本引入了 OpenSSL 3.0&#xff0c;它在算法和密钥大小方面实施了更为严格的限制。这一变化导致 npm 的升…