背景
今天客户问到一个问题。 我想新建一个账号给外部人员使用,但是我只想给他创建表的权限,这应该如何操作。开始可能认为这个问题很简单。
我新建一个登录账号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)
提示如下信息:
这是什么情况?
解决办法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只赋予创建表权限的文章就介绍到这了,更多相关sqlserver赋予创建表权限内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多数据库技术:SQLServer只赋予创建表权限的全过程,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/dtteaching/1086963.html