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 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
Sql-Server数据库单表查询 4.3实验课
Apr 05 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
SQL Server删除表中的重复数据
May 25 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
php动态生成JavaScript代码
2009/03/09 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
jquery简单体验
2007/01/10 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
python实现读取命令行参数的方法
2015/05/22 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
汽车装潢店创业计划书范文
2014/02/05 职场文书
经典婚礼主持词
2014/03/13 职场文书
财产公证书
2014/04/10 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
机械生产实习心得体会
2016/01/22 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis