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 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL Server2019数据库之简单子查询的具有方法
Apr 27 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 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
PHP 源代码压缩小工具
2009/12/22 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
python使用PyFetion来发送短信的例子
2014/04/22 Python
python中对list去重的多种方法
2014/09/18 Python
python 实时遍历日志文件
2016/04/12 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
对python函数签名的方法详解
2019/01/22 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
计算机专业个人求职自荐信
2013/09/21 职场文书
电子商务专业实习生自我鉴定
2013/09/24 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
学生会离职感言
2014/02/11 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
个人更名证明
2015/06/23 职场文书
工作感言一句话
2015/08/01 职场文书
python中pymysql包操作数据库方法
2022/04/19 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL