前兩天我們複習了SQL Server 2016推出的動態資料遮罩(DDM)及限閱戶(RLS),實現了單一資料表內從資料行和資料列兩個方向作權限限制,回到資料表身上,那麼有沒有對於資料表這一層的權限管理?
有的,今天我們回到最基本的使用者權限複習。
在授與使用者存取資料庫的資源前,我們必須完成SQL Server的認證(Authentication)及授權(Authorization)兩項工作:
舉個例子來說,認證就像是護照查驗,授權就像機票的艙等,要先通過海關,接著要有足夠的權限才能走進商務艙(business class)或是頭等艙(first class)。
在SQL Server的認證中,我們可以設定Windows帳號/群組或是SQL帳號,如果環境允許,常用的是Windows Domain帳號登入。
認證(Authentication)也分為兩個層級,資料庫執行個體登入及資料庫登入。
都認證完之後,才進行授權。此時SQL Server 才會看使用者的角色及權限回應使用者想存取的資源。
*資料庫執行個體(instance),SQL Server服務,一台機器可以裝很多個SQL Server,每一個都是就是獨立的instance。
今年年初msdn發行了一版設定資料庫物件的權限的課程,我們仿照了步驟來試試。
USE [master]
GO
CREATE LOGIN [day10] WITH PASSWORD=N'1qaz2wsx!'
GO
USE [SecurityDB];
GO
CREATE USER [day10] FOR LOGIN [day10];
GO
--檢查目前登入
SELECT SUSER_NAME(), USER_NAME();
--切換登入
EXECUTE AS LOGIN = 'day10';
--檢查登入
SELECT SUSER_NAME(), USER_NAME();
--查詢資料表
select * from [dbo].[cardholder]
尚未賦予權限前沒辦法查詢!
--回復身份
REVERT;
--授與權限 select dbo schema
use [SecurityDB]
GO
GRANT SELECT ON SCHEMA::[dbo] TO [day10]
GO
--切換登入
EXECUTE AS LOGIN = 'day10';
--檢查登入
SELECT SUSER_NAME(), USER_NAME();
--查詢資料表
select * from [dbo].[cardholder]
所有dbo schema下的資料表都可以查詢。
回到今天一開始的題目,通常我們都會賦予SQL查詢帳號有Select dbo schema權限,在這樣的條件下,我們來限制使用者不可以查詢。
作法就是DENY SELECT ON
Table!
--回復身份
REVERT;
--拒絕權限
use [SecurityDB]
GO
DENY SELECT ON cardholder TO [day10]
GO
--切換登入
EXECUTE AS LOGIN = 'day10';
--檢查登入
SELECT SUSER_NAME(), USER_NAME();
--查詢資料表
select * from [dbo].[cardholder]
從資料表的權限觀察:
也可以限制使用者新增(insert)、刪除(delete)及修改(update)。
--最後別忘了回復身份
REVERT;
如果我們只想讓使用者查看到這個資料表部分欄位,也可以使用**檢視(view)或預存程序(stored procedure)**來限制使用者查詢。
Authentication in SQL Server
https://msdn.microsoft.com/en-us/library/bb669066(v=vs.110).aspx
第 2 課:設定資料庫物件的權限
https://msdn.microsoft.com/zh-tw/library/ms365345(v=sql.120).aspx
建立登入
https://msdn.microsoft.com/zh-tw/library/ms365326(v=sql.120).aspx
建立檢視和預存程序
https://msdn.microsoft.com/zh-tw/library/ms365311(v=sql.120).aspx
EXECUTE AS (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms365311(v=sql.120).aspx
捷克警車
2013.05攝於Český Krumlov,Czech