隨著用戶數量增長,為每位用戶單獨指派權限將變得難以維護。SQL Server 採用角色機制(類似 Windows 群組),將權限集合指派給角色,再將用戶加入角色,大幅簡化權限管理。
sysusers:儲存用戶與角色資訊,IsSQLRole 欄位區分類型(1=角色,0=用戶)sysmembers:記錄角色與成員的對應關係SELECT
Member = Users.name,
Role = Roles.Name
FROM sysusers Users
INNER JOIN sysmembers Members ON Users.uid = Members.memberuid
INNER JOIN sysusers Roles ON Roles.uid = Members.groupuid
WHERE Roles.issqlrole = 1
ORDER BY 2, 1;
DECLARE @role VARCHAR(100) = 'Managers';
SELECT
MemberName = Users.name,
RoleName = Roles.Name
FROM sysusers Users
INNER JOIN sysmembers Members ON Users.uid = Members.memberuid
INNER JOIN sysusers Roles ON Roles.uid = Members.groupuid
WHERE Roles.name = @role
AND Roles.issqlrole = 1
ORDER BY 2, 1;
CREATE FUNCTION dbo.fn_IsUserInRole (
@username SYSNAME,
@rolename SYSNAME
)
RETURNS BIT
AS
BEGIN
DECLARE @result BIT = 0;
IF EXISTS (
SELECT 1
FROM sysusers u
INNER JOIN sysmembers m ON u.uid = m.memberuid
INNER JOIN sysusers r ON r.uid = m.groupuid
WHERE u.name = @username
AND r.name = @rolename
AND r.issqlrole = 1
)
SET @result = 1;
RETURN @result;
END;
GO
-- 使用範例
IF dbo.fn_IsUserInRole('john_doe', 'Managers') = 1
PRINT 'User has manager privileges';
新版本建議使用 sys.database_principals 與 sys.database_role_members 目錄檢視,並搭配 IS_ROLEMEMBER() 內建函數:
SELECT IS_ROLEMEMBER('db_datareader', 'john_doe'); -- 返回 1/0/NULL
掌握角色查詢技巧,能讓權限管理從「惡夢」變為可控、可審計的系統工程。