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数据库单表查询 4.3实验课
Apr 05 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL使用复合索引实现数据库查询的优化
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
浅析PHP水印技术
2007/02/14 PHP
php 中文和编码判断代码
2010/05/16 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
python实现的udp协议Server和Client代码实例
2014/06/04 Python
编程语言Python的发展史
2014/09/26 Python
python多进程操作实例
2014/11/21 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
python selenium xpath定位操作
2020/09/01 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
2015年乡镇扶贫工作总结
2015/04/08 职场文书
小学英语听课心得体会
2016/01/14 职场文书
nginx请求限制配置方法
2021/07/09 Servers