Cannot find the user 'dbo', because it does not exist or you do not have permission

 1. 檢查目前資料庫中的使用者是否存在 dbo
確認 dbo 是否真的是一個 "使用者"(user),而不是只有 schema。

-- 查詢目前資料庫內所有的使用者
SELECT name, type_desc
FROM sys.database_principals
WHERE name = 'dbo';


若查不到 dbo 或其 type_desc 不是 SQL_USER 或 WINDOWS_USER,表示它不是一個 user。
正確情況下 dbo 應該是 DATABASE_ROLE,不是使用者。


2. 檢查哪一行語法錯誤地參照了 dbo 作為 user
搜尋 SP 或 SQL 檔中使用 GRANT, REVOKE, DENY 等授權語句對象是否錯誤指向 dbo:
-- 搜尋資料庫內的物件含有 'GRANT ... TO dbo'
SELECT OBJECT_NAME(object_id), definition
FROM sys.sql_modules
WHERE definition LIKE '%GRANT%TO dbo%';


哪些 Stored Procedure 或 View 中誤用 GRANT TO dbo。

3. 在 SSMS 的 Object Explorer 中檢查目前登入帳號是否有權限存取目前資料庫
如果你懷疑是登入帳號無權限,也可能會報這錯:
-- 查看目前帳號是否有 mapping 到目前資料庫
SELECT dp.name AS UserName, dp.type_desc, dp.authentication_type_desc
FROM sys.database_principals dp
WHERE dp.sid = SUSER_SID();  -- 目前登入帳號的 SID
-- 顯示目前登入帳號所擁有的權限
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');


若查不到權限,表示登入帳號無權操作目前資料庫,可能造成 GRANT TO dbo 這類語法被拒絕執行。

4. 檢查是否有混淆 schema 與 user 的概念
有時候開發人員誤把 dbo 當作使用者來授權,其實它是 schema:
-- 檢查資料庫 schema 是否正確存在
SELECT name, principal_id
FROM sys.schemas
WHERE name = 'dbo';

如果寫了這種錯誤語法:
GRANT EXECUTE ON SCHEMA::dbo TO dbo;  -- ❌
這行應該是授權給使用者(User),但你卻指定了一個不存在的使用者 dbo,就會報錯。




完正範例

-- 1️⃣ 檢查目前資料庫中是否存在 dbo 使用者(應為 DATABASE_ROLE 或其他)
PRINT '1. 檢查是否存在 dbo 使用者';
SELECT name, type_desc
FROM sys.database_principals
WHERE name = 'dbo';

-- 2️⃣ 搜尋 GRANT/REVOKE/DENY 中是否錯誤使用 'dbo' 當作授權對象
PRINT '2. 搜尋是否有錯誤使用 GRANT/REVOKE/DENY TO dbo 的語法';
SELECT OBJECT_NAME(object_id) AS ObjectName, definition
FROM sys.sql_modules
WHERE definition LIKE '%GRANT%TO dbo%'
   OR definition LIKE '%REVOKE%FROM dbo%'
   OR definition LIKE '%DENY%TO dbo%';

-- 3️⃣ 檢查目前登入帳號是否有對應的 database user 並查詢權限
PRINT '3. 檢查目前登入帳號對資料庫的對應使用者與權限';
SELECT dp.name AS UserName, dp.type_desc, dp.authentication_type_desc
FROM sys.database_principals dp
WHERE dp.sid = SUSER_SID();

PRINT '目前登入帳號在本資料庫的權限:';
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');

-- 4️⃣ 檢查是否誤把 schema dbo 當作使用者
PRINT '4. 檢查資料庫中是否存在 dbo schema 並與使用者做錯誤關聯';
SELECT name AS SchemaName, schema_id, principal_id
FROM sys.schemas
WHERE name = 'dbo';

-- 額外補充:確認目前使用者是誰,正在使用哪個資料庫
PRINT '📌 當前使用者與資料庫:';
SELECT SYSTEM_USER AS LoginName, USER_NAME() AS DatabaseUser, DB_NAME() AS CurrentDatabase;



留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header