SQL Server 2000/2005 支援 sp_addalias 將登入映射為資料庫使用者 (Alias User),賦予 dbo 權限但**不顯示在 SSMS「使用者」節點**,造成權限審計盲區。此功能 **SQL Server 2008 已棄用**,2012 移除。本文提供檢測腳本、風險演示與遷移建議。
-- 建立登入
CREATE LOGIN AliasUser1 WITH PASSWORD = 'test';
CREATE LOGIN DBUser1 WITH PASSWORD = 'test';
-- 建立別名使用者 (舊語法)
EXEC sp_addalias 'AliasUser1', 'dbo'; -- 映射為 dbo
-- 正常使用者加入 db_owner 角色
CREATE USER DBUser1 FOR LOGIN DBUser1;
ALTER ROLE db_owner ADD MEMBER DBUser1;
SSMS 視圖盲區:AliasUser1 **不出現在**「資料庫」→「安全性」→「使用者」清單,但實際擁有完整 dbo 權限。
-- 方法一:查詢系統表 (SQL 2000/2005/2008)
SELECT name AS AliasUser, hasdbaccess, isaliased
FROM sys.sysusers
WHERE isaliased = 1;
-- 方法二:sp_helpuser (顯示別名專區)
EXEC sp_helpuser;
-- 結果集 2 會列出 "AliasUser1" 及其映射目標 "dbo"
-- 1. 別名使用者
SELECT 'Alias' AS Type, su.name AS Principal, 'dbo' AS MappedTo
FROM sys.sysusers su WHERE su.isaliased = 1
UNION ALL
-- 2. 角色成員 (含 db_owner)
SELECT 'RoleMember', dp.name, r.name
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON dp.principal_id = drm.member_principal_id
JOIN sys.database_principals r ON r.principal_id = drm.role_principal_id
WHERE r.name = 'db_owner'
UNION ALL
-- 3. 直接擁有 dbo schema 擁有權的使用者
SELECT 'SchemaOwner', dp.name, 'dbo'
FROM sys.database_principals dp
JOIN sys.schemas s ON s.principal_id = dp.principal_id
WHERE s.name = 'dbo' AND dp.type IN ('U','S','G');
-- 僅能用 sp_dropalias,不可用 sp_dropuser
EXEC sp_dropalias 'AliasUser1';
CREATE USER AliasUser1 FOR LOGIN AliasUser1;db_owner 角色:ALTER ROLE db_owner ADD MEMBER AliasUser1;EXEC sp_dropalias 'AliasUser1';