Cannot find the user 'dbo', because it does not exist or you do not have permission
1. 檢查目前資料庫中的使用者是否存在 dbo
確認 dbo 是否真的是一個 "使用者"(user),而不是只有 schema。
確認 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;
留言
張貼留言