SQLServer只赋予创建表权限的全过程

作者:OwenZeng_DBA 时间:2024-01-20 06:49:53 

背景

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

我新建一个登录账号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仍然可以创建表,和删除表,但是他直接创建和删除属于它的架构的表。这也起到了限定权限的问题。

来源:https://blog.csdn.net/z10843087/article/details/78801898

标签:sqlserver,用户表,权限
0
投稿

猜你喜欢

  • 使用Jupyter notebooks上传文件夹或大量数据到服务器

    2023-02-26 11:49:16
  • JavaScript正则表达式匹配 div style标签

    2024-04-10 10:40:10
  • 10分钟用Python快速搭建全文搜索引擎详解流程

    2023-11-06 16:13:41
  • jquery.jsPlumb实现拓扑图

    2024-05-09 10:15:49
  • 详解pandas获取Dataframe元素值的几种方法

    2022-12-28 07:30:01
  • python实现网页录音效果

    2022-03-19 08:07:15
  • Python中列表(List) 的三种遍历(序号和值)方法小结

    2022-08-24 23:17:39
  • Python sklearn中的K-Means聚类使用方法浅析

    2022-03-16 22:01:16
  • python pymysql链接数据库查询结果转为Dataframe实例

    2024-01-16 22:07:29
  • 地图网站的需求功能与体验

    2009-03-01 11:15:00
  • 解决windows下python3使用multiprocessing.Pool出现的问题

    2021-11-03 23:34:37
  • Python实现的多线程http压力测试代码

    2021-06-30 23:47:29
  • Pandas+Matplotlib 箱式图异常值分析示例

    2022-09-19 08:49:39
  • 菜鸟课堂:MySQL权限的详细解答

    2009-09-03 11:43:00
  • Python Pandas 删除列操作

    2023-12-17 22:03:53
  • Python异常对象Exception基础类异常捕捉

    2021-10-21 03:46:25
  • 浅谈vue-lazyload实现的详细过程

    2024-04-29 13:09:17
  • SQLSERVER SQL性能优化技巧

    2024-01-22 14:02:42
  • Python 查看list中是否含有某元素的方法

    2023-07-29 21:46:08
  • php实现上传图片保存到数据库的方法

    2024-05-09 14:48:35
  • asp之家 网络编程 m.aspxhome.com