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

故事背景:

公司使用的是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 GO
 3 
 4 DECLARE @TableName NVARCHAR(256);
 5 DECLARE @SQL NVARCHAR(MAX) = '';
 6 
 7 -- 获取用户A在dbo架构下所有表和视图的SELECT权限,并构建授权语句
 8 DECLARE TableCursor CURSOR FOR
 9 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)。在实际应用中,你可能需要根据实际情况调整上述脚本,以确保正确地复制所需的权限。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/598810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作 读者优先实例代码分析 写者优先示例代码分析 实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展,全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中,半导体作为信息产业的基础与核心,其重要性日益凸显,半导体的应用场景和市场需求将进一步扩大。 然而,在这一繁荣的背后&#x…

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…

源代码防泄露可以通过哪些方法实现?七种有效方法分享

在当今数字化时代&#xff0c;访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境&#xff0c;层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时&#xff0c;更需要一种综合的…

stable-diffusion-webui配置

源码地址 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git报错Fresh install fail to load AttributeError: NoneType object has no attribute _id pydantic降级 pip uninstall pydantic pip install pydantic1.10.11记得要把clip-vit-large-patch14放在opena…

Java集合 总结篇(全)

Java集合 集合底层框架总结 List 代表的有序&#xff0c;可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以&#xff0c;当数组空间不够的时候&#xff0c;会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表&#xff0c;不支持…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

【系统架构师】-选择题(十一)

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…

MySQL 报错: “Host ‘xxx‘ is not allowed to connect to this MySQL server“

MySQL 报错 “Host ‘xxx’ is not allowed to connect to this MySQL server” 通常是因为数据库服务器上的权限设置不允许来自特定主机&#xff08;‘xxx’&#xff09;的连接。解决这个问题通常涉及修改 MySQL 的访问控制设置。 以下是一些可能的解决步骤&#xff1a; 使用…

高效工作之:开源工具kettle实战

在运营商数据处理领域&#xff0c;Oracle存储过程一直是数据处理的核心工具&#xff0c;但随着技术的发展&#xff0c;寻找替代方案变得迫切。Kettle&#xff0c;作为Oracle存储过程的替代品&#xff0c;以其强大的功能和易用性&#xff0c;正逐渐受到运营商的青睐。本文将介绍…

C++基础——深拷贝和浅拷贝

C中类的拷贝有两种&#xff1a;深拷贝&#xff0c;浅拷贝&#xff1a;当出现类的等号赋值时&#xff0c;即会调用拷贝函数 一、概念 浅拷贝&#xff1a;同一类型的对象之间可以赋值&#xff0c;使得两个对象的成员变量的值相同&#xff0c;两个对象仍然是独立的两个对象&#…

【全网首发】Typecho文章采集器火车头插件去授权版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 目前市面上基本没有typecho火车头采集器 而分享的这一款采集器&#xff0c;牛的一批 内置使用方法与教程&#xff01; 二、效果展示 1.部分代码 代码如下&#xff08;示例&#…

嘎嘎好用的虚拟键盘第二弹之中文输入法

之前还在为不用研究输入中文而暗自窃喜 这不新需求就来了&#xff08;新需求不会迟到 它只是在路上飞一会儿&#xff09; 找到了个博主分享的代码 是好使的 前端-xyq 已经和原作者申请转载了 感谢~~ 原作者地址&#xff1a;https://www.cnblogs.com/linjiangxian/p/16223681.h…

Amazon Q Business现已正式上市!利用生成式人工智能协助提高员工生产力

在 2023 年度 AWS re:Invent 大会上&#xff0c;我们预览了 Amazon Q Business&#xff0c;这是一款基于生成式人工智能的助手&#xff0c;可以根据企业系统中的数据和信息回答问题、提供摘要、生成内容额安全地完成任务。 借助 Amazon Q Business&#xff0c;您可以部署安全、…

Java多线程编程之synchronizaed和锁分类

并发编程第三周 1 锁的分类 1.1 可重入锁&#xff0c;不可重入锁 Java提供的synchronized&#xff0c;ReentrantLock,ReentrantReadWriteLock都是可重入锁 可重入&#xff1a;当前线程获取到A锁&#xff0c;在获取之后尝试再次获取A锁是可以直接拿到的。 不可重入:当前线程…

python使用mongo操作

目前有个需求&#xff0c;就是把所有sql转为mongo管道查询 知识点 在 MongoDB 中&#xff0c;allowDiskUse 选项应该作为聚合命令的一个选项&#xff0c;而不是聚合管道的一个阶段。allowDiskUse 选项用于允许聚合操作使用磁盘空间来临时存储数据&#xff08;当聚合操作的数据…

[leetcode] 67. 二进制求和

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100"示例 2&#xff1a; 输…

串的模式匹配之KMP算法实现

概述 函数刻画 主串位置不变&#xff0c;next值就是模式串(子串)比较后应跳转的位置 不同位置 next[j]函数 next由模式串决定&#xff0c;看模式串当前比较位的前串中前后缀相同的个数来得k-1的值&#xff0c;next[当前位]k1 小补充 PM值&#xff1a;也称部分匹配值&#xf…