早期 SQL Server(2000/2005)允許將登入映射為資料庫內的 dbo 用戶:
EXEC sp_addalias 'LoginName', 'dbo';
此用戶**不出現在 SSMS「用戶」節點**,但擁有完整 db_owner 權限,極易被忽視成為安全盲區。
-- 1. 普通角色成員
SELECT DISTINCT
DB_NAME() AS Database_Name,
su.name AS Database_User
FROM sysusers su
JOIN sysmembers sm ON sm.memberuid = su.uid
JOIN sysmembers sm1 ON sm1.groupuid = sm.memberuid
JOIN sysusers su1 ON su1.uid = sm1.groupuid
WHERE su1.name = 'db_owner' AND su.name <> 'dbo';
-- 2. 別名用戶(關鍵補充)
SELECT name AS Aliased_User, 'ALIAS' AS Type
FROM sys.sysusers
WHERE isaliased = 1 AND issqluser = 0;
-- 3. 統一視圖(2005+ 推薦)
SELECT
dp.name AS Principal_Name,
dp.type_desc AS Principal_Type,
CASE WHEN sp.is_disabled = 1 THEN 'DISABLED' ELSE 'ENABLED' END AS Login_Status,
'DIRECT' AS Mapping_Type
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.is_fixed_role = 0 AND dp.name NOT IN ('dbo','guest','INFORMATION_SCHEMA','sys')
UNION ALL
SELECT
su.name, 'SQL_USER_ALIAS', 'N/A', 'ALIAS'
FROM sys.sysusers su
WHERE su.isaliased = 1;
-- 建立登入與別名
CREATE LOGIN AliasUser1 WITH PASSWORD = 'test';
EXEC sp_addalias 'AliasUser1', 'dbo'; -- 映射為 dbo
-- SSMS 中「用戶」節點**看不到** AliasUser1
-- 但使用 AliasUser1 登入可對資料庫為所欲為
EXEC sp_helpuser;(第二結果集顯示別名)EXEC sp_dropalias 'AliasUser1';(不可用 sp_dropuser)CREATE USER AliasUser1 FOR LOGIN AliasUser1;ALTER ROLE db_owner ADD MEMBER AliasUser1;sp_addalias 不存在-- 升級前必跑
SELECT name FROM sys.sysusers WHERE isaliased = 1;
-- 若有結果,必須先遷移為標準用戶+角色,再升級
**核心原則:別名機制破壞了權限可見性,現代版本已棄用移除,存量系統必須清理遷移。**