Sql-Server-2017
當預設模式中不存在表時禁用 dbo 模式回退
我已經在 SQL Server 2017 中正確執行了這些 SQL 命令:
CREATE DATABASE DataTeamDatabase USE DataTeamDatabase CREATE LOGIN DataTeamUser WITH PASSWORD = 'YourStrong!Passw0rd', DEFAULT_DATABASE = DataTeamDatabase; CREATE SCHEMA DataTeamSchema CREATE USER DataTeamUser FOR LOGIN DataTeamUser WITH DEFAULT_SCHEMA = DataTeamSchema ALTER ROLE db_datareader add member DataTeamUser ALTER ROLE db_datawriter add member DataTeamUser ALTER ROLE db_ddladmin add member DataTeamUser GRANT CONNECT TO datateamuser CREATE TABLE dbo.TestTable (column_1 int) ALTER USER DataTeamUser WITH DEFAULT_SCHEMA = DataTeamSchema;
現在,假設我要查詢 TestTable(我知道它不存在於 中
DataTeamSchema
):SELECT * FROM TestTable
由於該表
TestTable
在 DataTeamSchema 中不存在,SQL 伺服器正在dbo
模式中查找並使用它。有沒有辦法禁用這種行為?我知道將模式名稱添加到表名稱之前會起作用,但由於不同的原因,我想避免這種情況。
我搜尋了 SQL 伺服器文件,但到目前為止沒有找到任何東西。
謝謝,
馬蒂亞
總之,不,這是不可能的。
我一直在努力尋找官方的說法,但是 SQL Server 中的名稱解析算法類似於以下內容,由 Bob Beauchemin 在Dude, Where’s my table?
如果是批處理或動態 SQL:
- 在“sys”模式中查找系統對象
- 查看使用者的預設架構
- 查看 dbo 架構
如果程式碼:
- 在“sys”模式中查找系統對象
- 查看過程模式
- 查看 dbo 架構
在您的情況下,SQL Server 首先無法找到 MS Shipped 對象,然後無法在使用者架構 (DataTeamSchema) 中找到該對象,最後它在 dbo 架構中找到該對象。
解決此問題的一種方法是將原始對象更改為 dbo 以外的模式,因為 dbo 模式在對象名稱解析方面是一種特殊情況。
似乎沒有記錄的方法可以避免這種行為。