SQLServer只賦予創(chuàng)建表權(quán)限的全過程
背景
今天客戶問到一個問題。 我想新建一個賬號給外部人員使用,但是我只想給他創(chuàng)建表的權(quán)限,這應(yīng)該如何操作。開始可能認(rèn)為這個問題很簡單。
我新建一個登錄賬號A
USE [master] GO CREATE LOGIN [A] WITH PASSWORD=N'123456', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO
創(chuàng)建數(shù)據(jù)庫級別的用戶A
USE [security_test] GO CREATE USER [a] FOR LOGIN [a] WITH DEFAULT_SCHEMA=[dbo] GO
賦予創(chuàng)建表的權(quán)限
GRANT CREATE TABLE TO A;

然后給他賦予創(chuàng)建表的權(quán)限
現(xiàn)在試試建表
CREATE TABLE test (id int)
提示如下信息:

這是什么情況?
解決辦法1
創(chuàng)建表,每個表都是需要一個所有者,就是架構(gòu)名。 對于我們的創(chuàng)建表語句 CREATE TABLE test (id int) 它其實默認(rèn)使用的是 dbo架構(gòu)。
A用戶有了創(chuàng)建表的權(quán)限,還需要有dbo 架構(gòu)的修改權(quán)限。 于是我們需要:
GRANT ALTER ON SCHEMA::dbo TO A; GO
但此時我們會遇到另外一個問題,就是加上這個權(quán)限之后,A用戶除了create table 之外還能做drop table ,alter table等操作。
所以我們需要創(chuàng)建一個DDL 觸發(fā)器 ,來阻止其他的操作
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
如果,創(chuàng)建的表不需要使用默認(rèn)的dbo架構(gòu)
那么可以給 給外部人員單獨(dú)創(chuàng)建一個shchema 。給新建一個架構(gòu)schema ,
create schema schema1 authorization dbo go
然后
grant create table to A grant alter, insert on schema::schema1 to A
此時,A仍然可以創(chuàng)建表,和刪除表,但是他直接創(chuàng)建和刪除屬于它的架構(gòu)的表。這也起到了限定權(quán)限的問題。
總結(jié)
到此這篇關(guān)于SQLServer只賦予創(chuàng)建表權(quán)限的文章就介紹到這了,更多相關(guān)SQLServer賦予創(chuàng)建表權(quán)限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文教會你在sqlserver中創(chuàng)建表
- 淺析SQL Server授予了CREATE TABLE權(quán)限但是無法創(chuàng)建表
- sql server 2000中禁止創(chuàng)建表(權(quán)限設(shè)置方法)
- SQL Server 2008 阻止保存要求重新創(chuàng)建表的更改問題的設(shè)置方法
- SqlServer使用 case when 解決多條件模糊查詢問題
- SqlServer 巧妙解決多條件組合查詢
- sqlserver和oracle中對datetime進(jìn)行條件查詢的一點(diǎn)區(qū)別小結(jié)
- SQL?Server數(shù)據(jù)庫創(chuàng)建表及其約束條件的操作方法
相關(guān)文章
ASP.NET下向SQLServer2008導(dǎo)入文件實例操作方法
在Microsoft SQL Server2008以后的版本中,將刪除image數(shù)據(jù)類型。在新的開發(fā)工作中將不適用此數(shù)據(jù)類型,并打算修改當(dāng)前使用此數(shù)據(jù)類型的應(yīng)用程序,改用varbinary(max)數(shù)據(jù)類型。2010-09-09
MSSQLSERVER不同版本設(shè)置開啟遠(yuǎn)程連接(sa配置)
這篇文章主要為大家詳細(xì)介紹了MSSQLSERVER不同版本設(shè)置開啟遠(yuǎn)程連接,包括SQL SERVER 2008/2012/2012R2/2014開啟遠(yuǎn)程連接的設(shè)置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
sqlserver數(shù)據(jù)庫中的表、字段sql語句
在數(shù)據(jù)庫中創(chuàng)建的每個對象(例如約束、默認(rèn)值、日志、規(guī)則以及存儲過程)都對應(yīng)一行。2010-06-06
修復(fù)SQL Server數(shù)據(jù)庫中的恢復(fù)掛起狀態(tài)的方法總結(jié)
SQL 服務(wù)器恢復(fù)掛起可能是因為在解析數(shù)據(jù)庫中的某些事務(wù)期間系統(tǒng)關(guān)閉不當(dāng),在本文中,將向你提供各種方法來修復(fù) SQL Server 數(shù)據(jù)庫中的恢復(fù)掛起狀態(tài),需要的朋友可以參考下2024-03-03
將ACCESS數(shù)據(jù)庫遷移到SQLSERVER數(shù)據(jù)庫兩種方法(圖文詳解)
這篇文章介紹了ACCESS數(shù)據(jù)庫遷移到SQLSERVER數(shù)據(jù)庫兩種方法,有需要的朋友可以參考一下2013-10-10
設(shè)置密碼保護(hù)的SqlServer數(shù)據(jù)庫備份文件與恢復(fù)文件的方法
設(shè)置密碼保護(hù)的SqlServer數(shù)據(jù)庫備份文件與恢復(fù)文件的方法,需要的朋友可以參考下。2011-10-10
卸載VS2011 Developer Preview后Sql Server2008&nbs
話說上回我為了嘗嘗螃蟹的味道而裝了 VS2011 Developer Preview,但是裝完后立馬卸載掉了,原因是這家伙的安裝目錄位置沒用,我設(shè)置到D盤的但是裝完后D盤的文件夾只有一百多M,而足足8G+的空間是在C盤上消耗的。2011-11-11
MSSQL轉(zhuǎn)MYSQL,gb2312轉(zhuǎn)utf-8無亂碼解決方法
MSSQL轉(zhuǎn)MYSQL,gb2312轉(zhuǎn)utf-8無亂碼解決方法,需要的朋友可以參考下。2010-06-06
用sql實現(xiàn)18位身份證校驗代碼分享 身份證校驗位計算
這篇文章主要介紹了用SQL寫的18位身份證校驗代碼,大家參考使用吧2014-01-01

