SQLServer权限之只开启创建表权限


Posted in SQL Server onApril 12, 2022

背景

今天客户问到一个问题。 我想新建一个账号给外部人员使用,但是我只想给他创建表的权限,这应该如何操作。开始可能认为这个问题很简单。

我新建一个登录账号A

USE [master]
GO
CREATE LOGIN [A] WITH PASSWORD=N'123456', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

创建数据库级别的用户A

USE [security_test]
GO
CREATE USER [a] FOR LOGIN [a] WITH DEFAULT_SCHEMA=[dbo]
GO

赋予创建表的权限

GRANT CREATE TABLE TO A;

SQLServer权限之只开启创建表权限

然后给他赋予创建表的权限

现在试试建表

CREATE TABLE test (id int)

提示如下信息:

SQLServer权限之只开启创建表权限

这是什么情况?

解决办法1

创建表,每个表都是需要一个所有者,就是架构名。 对于我们的创建表语句  CREATE TABLE test (id int)  它其实默认使用的是 dbo架构。

A用户有了创建表的权限,还需要有dbo 架构的修改权限。 于是我们需要:

GRANT ALTER ON SCHEMA::dbo TO A;
GO

但此时我们会遇到另外一个问题,就是加上这个权限之后,A用户除了create table 之外还能做drop table ,alter table等操作。

所以我们需要创建一个DDL 触发器 ,来阻止其他的操作

CREATE TRIGGER db_trigger_BlockNonTableDDL
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS
AS 
BEGIN 
   IF IS_MEMBER('A') = 1
   BEGIN 
 
      DECLARE @TriggerEventText nvarchar(max);
      SET @TriggerEventText = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 
      IF NOT ((@TriggerEventText LIKE 'CREATE TABLE%'))
      BEGIN
         RAISERROR (@TriggerEventText, 16, 1)
         ROLLBACK TRANSACTION; 
      END
   END; 
END; 
GO

解决办法2

如果,创建的表不需要使用默认的dbo架构 

那么可以给 给外部人员单独创建一个shchema 。给新建一个架构schema ,

create schema schema1 authorization dbo
go

然后

grant create table to A
grant alter, insert on schema::schema1 to A

此时,A仍然可以创建表,和删除表,但是他直接创建和删除属于它的架构的表。这也起到了限定权限的问题。

总结

到此这篇关于SQLServer只赋予创建表权限的文章就介绍到这了!

SQL Server 相关文章推荐
SQL Server基本使用和简单的CRUD操作
Apr 05 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL中的三种去重方法小结
Nov 01 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 SQL Server
如何使用SQL Server语句创建表
Apr 12 #SQL Server
MSSQL基本语法操作
Apr 11 #SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 #SQL Server
sql server偶发出现死锁的解决方法
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 #SQL Server
SQL Server表分区降低运维和维护成本
SQL Server使用导出向导功能
You might like
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
Angular排序实例详解
2017/06/28 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python中元组,列表,字典的区别
2017/05/21 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
学校经典推荐信
2013/10/30 职场文书
客服服务心得体会
2013/12/30 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
欢送退休感言
2014/02/08 职场文书
质量承诺书怎么写
2014/05/24 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang