Sql-Server

SQL 2008 R2 在 Windows 使用者創建表時創建使用者/模式

  • October 15, 2019

我們使用以下腳本添加了一個伺服器登錄和數據庫使用者,將 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 會執行以下操作:

  1. 在 AppDb 中創建一個“DOMAIN\User1”使用者,該使用者使用 SSMS\Security\Logins 中未為實例列出的“DOMAIN\User1”登錄名。
  2. 在 AppDb 中創建一個“DOMAIN\User1”架構。
  3. 使用新的 ‘DOMAIN\User1’ 架構創建這些表。

我對這些結果完全感到困惑。以下是我的問題:

  1. 我希望表創建失敗而不是創建其他對象。有人可以指點我線上圖書中解釋這一點的部分嗎?
  2. 如果要添加架構,為什麼伺服器不創建“DOMAIN\AppUsers”架構並將新表添加到該架構?
  3. 此外,數據庫如何使用 SSMS\Security\Logins 中未顯示的登錄名?
  4. 查看 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
  • 每個客戶端權限的模式中的程式碼:DesktopWebGUI

使用 dbo 模式是如此上千年:-) 連結:

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