Sql-Server
SQL 2008 R2 在 Windows 使用者創建表時創建使用者/模式
我們使用以下腳本添加了一個伺服器登錄和數據庫使用者,將 Windows 組映射到 SQL 2008 R2 實例,並更改了名稱以實現匿名:
USE master go CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english] go USE AppDb go CREATE USER [DOMAIN\AppUsers] FOR LOGIN [DOMAIN\AppUsers] go EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers' go
當 DOMAIN\User1 帳戶登錄到應用程序時,User1 可以很好地查詢 dbo 模式中的表,因為 User1 是 DOMAIN\AppUsers 的成員,但是這個應用程序也允許使用者創建表。在不指定架構的情況下創建這些表時,SQL Server 會執行以下操作:
- 在 AppDb 中創建一個“DOMAIN\User1”使用者,該使用者使用 SSMS\Security\Logins 中未為實例列出的“DOMAIN\User1”登錄名。
- 在 AppDb 中創建一個“DOMAIN\User1”架構。
- 使用新的 ‘DOMAIN\User1’ 架構創建這些表。
我對這些結果完全感到困惑。以下是我的問題:
- 我希望表創建失敗而不是創建其他對象。有人可以指點我線上圖書中解釋這一點的部分嗎?
- 如果要添加架構,為什麼伺服器不創建“DOMAIN\AppUsers”架構並將新表添加到該架構?
- 此外,數據庫如何使用 SSMS\Security\Logins 中未顯示的登錄名?
- 查看 SSMS\Databases\AppDb\Security\Users 中的 ‘DOMAIN\User1’ 使用者,使用者圖示有一個向下的紅色小箭頭。那是什麼意思?
我們剛剛開始在一個為了簡單起見而首選 SQL 身份驗證的組織中使用 Windows 身份驗證,所以我確信我的問題來自於對差異的無知。這段程式碼是在我們考慮使用 Windows 身份驗證之前編寫的,所以我確信我們需要提高我們對使用 Windows 身份驗證作為數據庫所有者以外的任何人登錄時創建新模式的理解。
如果你不知道,我是推動使用 Windows 身份驗證而不是 SQL 身份驗證的人。如果我們對此沒有深入了解,我們將回到 SQL 身份驗證。
這一直發生,回到 SQL Server 2000。
沒有架構,SQL Server 怎麼知道你想把它放在
dbo
架構中?指定預設模式的唯一方法是:
- 使用 SQL 登錄(不是 Windows)
- 以“系統管理員”身份執行
這些都不能接受
最佳實踐是始終為 DDL 和 DML 的每個對象引用限定模式。由於計劃重用,有明顯的性能優勢。
此外,對於 SQL Server 2005,故意使用架構更好:
- 中的表
Data
- 等中
Archive
的其他表Staging
- 每個客戶端權限的模式中的程式碼:
Desktop
等WebGUI
使用 dbo 模式是如此上千年:-) 連結: