Sql-Server-2017

當預設模式中不存在表時禁用 dbo 模式回退

  • August 13, 2019

我已經在 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:

  1. 在“sys”模式中查找系統對象
  2. 查看使用者的預設架構
  3. 查看 dbo 架構

如果程式碼:

  1. 在“sys”模式中查找系統對象
  2. 查看過程模式
  3. 查看 dbo 架構

在您的情況下,SQL Server 首先無法找到 MS Shipped 對象,然後無法在使用者架構 (DataTeamSchema) 中找到該對象,最後它在 dbo 架構中找到該對象。

解決此問題的一種方法是將原始對象更改為 dbo 以外的模式,因為 dbo 模式在對象名稱解析方面是一種特殊情況。

似乎沒有記錄的方法可以避免這種行為。

引用自:https://dba.stackexchange.com/questions/245199