本系列打算用於記錄本人在工作中使用到Azure的功能,主要記錄與本地SQL Server或者其他比較不一樣的地方,不過由於每個人對工具軟件的熟悉程度和側重點不一樣,所以無法覆蓋所有讀者的需求。
前言
第一篇文章記錄的是關於Azure SQL DB的用戶,在非PaaS版本中,我們通常都使用SSMS來創建和管理登錄名和用戶。不過對於PaaS,就有點不同。
因爲PaaS在界面和權限上跟非PaaS的有比較大的差異,所以假設你不用用到sa這種級別的賬號,那麼在Azure SQL DB中應該怎麼進行登陸和用戶的管理呢?
在非PaaS環境中,你會有一個登錄名(login)用來登錄SQL Server,可以是SQL 身份驗證或者是Windows身份驗證甚至AD域賬號認證(實際上就是一種Windows身份驗證),登錄名只是讓你訪問SQL Server,但是不能直接使用裏面的數據庫,爲了達到這個目的,就出現了“用戶(users)”,用戶就是把登錄名通過指定特定的安全組,並映射到獨立數據庫中,使其可以真正使用數據庫,並且不用使用登錄名登陸SQL Server然後又要使用用戶名訪問特定數據庫。
形象點來說,登錄名就是允許你進入一個酒店裏面,可以在大堂或者走廊走動,但是你不能進入客房,直到你獲得允許,這個時候你就變成了一個用戶,可以進入特定的客房。
PaaS和非PaaS的差異
平臺差異
兩種不同的平臺,在服務器和數據庫層面的安全性有相似的地方,也有一些不同的地方,比如:
- 包含的用戶:contained user,在Azure SQL DB中它並不映射到一個登錄名,而是由Azure Active Directory或者數據庫本身來授權。在非PaaS中,一個登錄名會映射到數據庫中已存在的用戶。這種做法的好處是使得數據庫更易於移植,畢竟雲平臺上很多的移植或者遷移都是必須的。
- 某些DB 角色的差異:db_datareade, db_datawriter等是相同的,但是比如sysadmin和serveradmin等是不存在於Azure SQL DB,可以看看下面這個圖,不過由兩個新的服務器級別角色可以替代,dbmanager,類似於dbcreator可以創建和刪除數據庫,loginmanager類似於securityadmin可以創建新登錄名,注意這裏是server的securityadmin而不是下圖的db_securityadmin。
- SSMS的操作受限程度很高,絕大部分的鼠標操作最終還是彈出SQL命令,比如右鍵“Logins”然後選擇“New Login”,出現的就如下圖:
演示
下面按照幾種常見的需求演示一下:
創建常規的SQL 身份驗證
使用你在portal上面創建SQL DB時定義的賬號及密碼連到SQL DB(此時爲master庫,如果時其他庫,是創建不了登錄名的),創建一個SQL 身份認證的登錄名叫test的,密碼爲1234.abc。然後在用戶數據庫中創建一個用戶映射到test登錄名中,最後添加到db_datareader和db_datawriter角色中。
-- 在Master庫中創建SQL 身份驗證的登錄名
CREATE LOGIN test
WITH PASSWORD = '1234.abc!'
新開一個窗口,然後執行:
-- 選擇目標數據庫,然後映射到剛纔的login中
CREATE USER [test]
FOR LOGIN [test]
WITH DEFAULT_SCHEMA = dbo;
-- 授權
ALTER ROLE db_datareader ADD MEMBER [test];
ALTER ROLE db_datawriter ADD MEMBER [test];
在Azure SQL中,如果你要對所有的庫都創建的話,由於不能直接使用USE DB這個命令切換當前數據庫,所以你需要打開新的查詢窗口。
創建包含用戶的SQL 身份驗證用戶
操作幾乎一樣,不過注意CREATE USER後面的關鍵字,包含用戶是不需要FOR LOGIN的,直接創建在對應的數據庫中即可。
Azure AD用戶的創建
重點在於FROM 後面:
-- 添加包含得Azure AD 用戶,不需要使用密碼
CREATE USER [name@domain.com]
FROM EXTERNAL PROVIDER
WITH DEFAULT_SCHEMA = dbo;
-- 授權
ALTER ROLE dbmanager ADD MEMBER [name@domain.com];
ALTER ROLE loginmanager ADD MEMBER [name@domain.com];
創建具有服務器管理權限的用戶
如果需要分配一個賬號給其他人進行服務器管理,可以在master庫中創建一個用戶來實現:
-- 創建登錄名
CREATE LOGIN [test2]
WITH PASSWORD='1234.abc!';
-- 創建常規的SQL 身份驗證用戶到Master庫
CREATE USER [test2]
FROM LOGIN [test2]
WITH DEFAULT_SCHEMA=dbo;
-- 添加前面提到的dbmanager和loginmanager角色
ALTER ROLE dbmanager ADD MEMBER [test2];
ALTER ROLE loginmanager ADD MEMBER [test2];
然後可以使用test2這個用戶來創建數據庫和登錄賬號的常見刪除。如果使用這個用戶創建數據庫,那麼這個用戶就是數據庫的owner。
說明
Dbmanager是master庫中的角色,所以只能把數據庫用戶添加到這個角色,不能把一個服務器級別的登錄名添加給一個數據庫級別的角色。