1. 程式人生 > >SqlServer 2012 伺服器角色

SqlServer 2012 伺服器角色

從SqlServer 2012 開始,MSSQL 可以建立伺服器角色!伺服器級別的許可權可以任意控制了!

資料庫預設有9種固定伺服器角色:Bulkadmin、Dbcreator、Diskadmin、Processadmin、Securityadmin、Serveradmin、Setupadmin、setupadmin、Sysadmin、Public

伺服器角色在安全物件中,如圖:


右鍵 “伺服器角色”  可以圖形介面建立伺服器角色,以下以命令方式建立:

建立伺服器角色所需許可權: sysadmin  或 CONTROL SERVER  或 ALTER ANY SERVER ROLE

1. 建立伺服器角色


--	【建立伺服器角色】
CREATE SERVER ROLE TestServerRole	--伺服器角色
AUTHORIZATION KK	--所有者
GO

ALTER AUTHORIZATION ON SERVER ROLE::[TestServerRole] TO [PC\Administrator]--更改所有者為[PC\Administrator]
GO


2. 更改伺服器角色

--	【更改伺服器角色】
--	注: 以下MEMBER 可以是登入名或使用者定義的伺服器角色。MEMBER 不能是固定伺服器角色、資料庫角色或 sa。

--即登入賬號[kk]擁有伺服器角色[TestServerRole]許可權
ALTER SERVER ROLE [TestServerRole] ADD MEMBER [kk]	
GO

--更名
ALTER SERVER ROLE [TestServerRole] WITH NAME = [NewTestServerRole]	
GO

--即伺服器角色[TestServerRole]擁有伺服器角色[dbcreator]許可權
ALTER SERVER ROLE [dbcreator] ADD MEMBER [NewTestServerRole]	
GO

可以看到伺服器角色名字變更了,同時角色成員用記錄有登入賬號 “KK”

資料庫角色 NewTestServerRole 的伺服器角色成關係中 勾選上了 dbcreator ,即伺服器角色 NewTestServerRole 也有了角色 dbcreator  的許可權!

開啟登入右鍵登入名 “KK” ,可以看到其擁有的伺服器角色。

3. 刪除伺服器角色

--	【刪除伺服器角色】
ALTER SERVER ROLE [NewTestServerRole] DROP MEMBER [kk]	--先刪除角色成員
GO
DROP SERVER ROLE [NewTestServerRole]
GO

注:大部分系統儲存過程已不推薦使用,如 sp_addsrvrolemember 和 sp_dropsrvrolemember

4. 以單個許可權授予物件

--	【以單個許可權授予物件】
GRANT CONNECT SQL TO [TestServerRole]
GO
ALTER SERVER ROLE [TestServerRole] ADD MEMBER [kk]
GO
--	許可權等價於下面對登入賬號 [kk] 的單獨授權
GRANT CONNECT SQL TO [kk] AS [sa]
GO

5. 相關目錄檢視
SELECT * FROM sys.server_principals
SELECT * FROM sys.server_role_members

--	伺服器角色和成員關係
SELECT rsp.principal_id as [role_principal_id],rsp.name AS [Server_Role],sp.principal_id
,sp.name,sp.[sid],sp.[type] AS [Principal_Type],sp.create_date,sp.modify_date,sp.is_disabled  
FROM sys.server_principals sp   
INNER JOIN sys.server_role_members srm ON sp.principal_id=srm.member_principal_id   
INNER JOIN sys.server_principals rsp ON srm.role_principal_id=rsp.principal_id

--	伺服器登入賬號擁有的詳細許可權
SELECT DISTINCT sp1.name AS grantor_name,sp1.type_desc AS grantor_type_desc ,sp2.name AS grantee_name
,sp2.type_desc AS grantee_type_desc ,spe.class_desc,spe.state_desc,spe.permission_name  
FROM sys.server_principals sp1  
INNER JOIN sys.server_permissions spe ON sp1.principal_id=spe.grantor_principal_id  
INNER JOIN sys.server_principals sp2 ON sp2.principal_id=spe.grantee_principal_id