本文小编为大家详细介绍“SQLServer怎么实现只赋予创建表权限”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQLServer怎么实现只赋予创建表权限”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
今天客户问到一个问题。 我想新建一个账号给外部人员使用,但是我只想给他创建表的权限,这应该如何操作。开始可能认为这个问题很简单。
我新建一个登录账号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;
然后给他赋予创建表的权限
现在试试建表
CREATE TABLE test (id int)
提示如下信息:
这是什么情况?
创建表,每个表都是需要一个所有者,就是架构名。 对于我们的创建表语句 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
如果,创建的表不需要使用默认的dbo架构
那么可以给 给外部人员单独创建一个shchema 。给新建一个架构schema ,
create schema schema1 authorization dbo
go
然后
grant create table to A
grant alter, insert on schema::schema1 to A
此时,A仍然可以创建表,和删除表,但是他直接创建和删除属于它的架构的表。这也起到了限定权限的问题。
读到这里,这篇“SQLServer怎么实现只赋予创建表权限”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
亿速云「云数据库 MySQL」免部署即开即用,比自行安装部署数据库高出1倍以上的性能,双节点冗余防止单节点故障,数据自动定期备份随时恢复。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。