SQL 2008 R2 tạo người dùng / lược đồ khi người dùng Windows tạo bảng


9

Chúng tôi đã thêm người dùng đăng nhập và cơ sở dữ liệu máy chủ ánh xạ Nhóm Windows vào phiên bản SQL 2008 R2 bằng cách sử dụng tập lệnh sau, với các tên được thay đổi để ẩn danh:

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

Khi tài khoản DOMAIN \ User1 đăng nhập vào ứng dụng, User1 truy vấn các bảng trong lược đồ dbo tốt vì User1 là thành viên của DOMAIN \ AppUsers, nhưng ứng dụng này cũng cho phép người dùng tạo bảng. Khi tạo các bảng này mà không chỉ định lược đồ , SQL Server thực hiện như sau:

  1. Tạo người dùng 'DOMAIN \ User1' trong AppDb sử dụng thông tin đăng nhập 'DOMAIN \ User1' không được liệt kê trong SSMS \ Security \ Đăng nhập chẳng hạn.
  2. Tạo lược đồ 'DOMAIN \ User1' trong AppDb.
  3. Tạo các bảng đó bằng cách sử dụng trong lược đồ 'DOMAIN \ User1' mới.

Tôi hoàn toàn bị cản trở bởi những kết quả này. Đây là câu hỏi của tôi:

  1. Tôi hy vọng việc tạo bảng sẽ thất bại thay vì tạo các đối tượng bổ sung. Ai đó có thể chỉ cho tôi phần của Sách trực tuyến giải thích điều này không?
  2. Tại sao máy chủ không tạo lược đồ 'DOMAIN \ AppUsers' và thêm các bảng mới vào lược đồ đó nếu nó sẽ thêm các lược đồ?
  3. Ngoài ra, làm thế nào để cơ sở dữ liệu sử dụng thông tin đăng nhập không được hiển thị trong SSMS \ Security \ Logins?
  4. Nhìn vào người dùng 'DOMAIN \ User1' trong SSMS \ Cơ sở dữ liệu \ AppDb \ Security \ Users, biểu tượng người dùng có một mũi tên nhỏ màu đỏ chỉ xuống. Điều đó nghĩa là gì?

Chúng tôi mới bắt đầu sử dụng Xác thực Windows trong một tổ chức ưa thích Xác thực SQL vì đơn giản, vì vậy tôi chắc chắn rằng câu hỏi của tôi xuất phát từ việc không biết gì về sự khác biệt. Mã này đã được viết từ lâu trước khi chúng tôi xem xét sử dụng Windows xác thực, vì vậy tôi chắc chắn rằng chúng tôi cần cải thiện hiểu biết của mình về việc tạo các lược đồ mới khi đăng nhập bằng Windows xác thực như bất kỳ ai khác ngoài chủ sở hữu cơ sở dữ liệu.

Trong trường hợp bạn không thể biết, tôi là người thúc đẩy việc sử dụng Xác thực Windows qua Xác thực SQL. Nếu chúng ta không hiểu rõ về điều này, chúng ta sẽ quay trở lại Xác thực SQL.


Bạn có thể xác định Schema mặc định {dbo, ví dụ} cho người dùng tên miền, nhưng không phải cho các nhóm miền.

Câu trả lời:


9

Điều này luôn xảy ra, trở lại SQL Server 2000.
Không có lược đồ, làm thế nào SQL Server biết bạn muốn đưa nó vào dbolược đồ?

Cách duy nhất để xác định một lược đồ mặc định là:

  • sử dụng thông tin đăng nhập SQL (không phải Windows)
  • chạy như "sysadmin"

Cả hai điều này đều được chấp nhận

Thực tiễn tốt nhất là luôn luôn đủ điều kiện lược đồ cho mọi tham chiếu đối tượng cho DDL và DML. Có lợi ích hiệu suất rõ ràng vì sử dụng lại kế hoạch.

Ngoài ra, sử dụng lược đồ có chủ ý sẽ tốt hơn cho SQL Server 2005:

  • bảng trong Data
  • các bảng khác trong Archive, Stagingvv
  • mã trong các lược đồ cho mỗi quyền của khách hàng Desktop, WebGUIv.v.

Sử dụng schema dbo là quá thiên niên kỷ trước :-) Liên kết:


Vì vậy, điều tôi tránh khỏi điều này là chúng ta nên cập nhật mã để tiền tố các bảng mới với lược đồ, phải không? Điều này có nghĩa là việc người dùng mới xuất hiện dưới nút Bảo mật có phải là một sự xuất hiện phổ biến không?
flipdoubt

@flipdoubt: có cho cả hai. Khi bạn truy cập vào nó và sử dụng các lược đồ làm không gian tên hoặc vùng chứa, nó sẽ trở thành bản chất thứ hai
gbn

Một câu hỏi cuối cùng. Nếu thông thường có người dùng tự động thêm và cách tốt nhất để chỉ định các lược đồ trong khi tạo đối tượng, làm thế nào bạn có thể cấp quyền cho lược đồ mới trước khi người dùng được tạo tự động tạo ra lỗi truy vấn một đối tượng trong lược đồ mới? Sử dụng ví dụ tôi đã đăng liên quan đến 'DOMAIN \ User1', tôi có thể chỉ định quyền truy cập vào tài khoản 'DOMAIN \ AppUsers', nhưng các truy vấn sẽ sử dụng quyền truy cập cho 'DOMAIN \ User1' hoặc 'DOMAIN \ AppUsers'? Nó chỉ lén lút đến mức máy chủ tạo người dùng ngay khi đối tượng được tạo.
flipdoubt

Quyền sẽ mặc định cho chủ sở hữu lược đồ, đó là user1. Điều này giống như DB_OWNER cho lược đồ
gbn

2

Vâng @gbn các loại nhanh hơn tôi ...

Ưu đãi duy nhất của tôi là ... Bạn tham khảo người dùng đang đăng nhập vào ứng dụng và cho phép người dùng tạo các bảng và như vậy. Nếu ứng dụng cho phép điều này và người dùng không thực hiện việc này thông qua chính SQL Server (đăng nhập trực tiếp vào cơ sở dữ liệu bằng SSMS) thì bạn sẽ cần kiểm tra với nhà cung cấp ứng dụng đó.


Chúng tôi đã viết ứng dụng.
flipdoubt

2

Mặc dù câu hỏi đã rất cũ và nó đã có câu trả lời được chấp nhận, tôi sẽ cố gắng trả lời câu hỏi của bạn cụ thể hơn (thay vì đưa ra lời khuyên chung chung).

  1. Hành vi này được ghi lại trong https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql , trong phần "Lược đồ ngầm và tạo người dùng"

  2. Nếu bạn muốn các đối tượng được tạo trong một lược đồ cụ thể (khi lược đồ không được chỉ định rõ ràng trong câu lệnh), bạn nên chỉ định DEFAULT_SCHema cho người dùng. Trong SQL Server 2008 R2 (và các phiên bản cũ hơn), bạn sẽ gặp lỗi nếu bạn cố gán DEFAULT_SCHema cho người dùng dựa trên nhóm Windows, nhưng trong SQL Server 2012 (và các phiên bản mới hơn) hiện đã có thể.

  3. Nó không được hiển thị đơn giản vì không có thông tin đăng nhập cho người dùng đó. Như được chỉ định trong https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql , người dùng có thể được tạo cho người đăng nhập bằng cách sử dụng một nhóm khác hoặc thậm chí không có bất kỳ đăng nhập.

  4. Mũi tên nhỏ màu đỏ (hoặc chữ x nhỏ màu đỏ trong các phiên bản SSMS mới hơn) đại diện cho người dùng không có quyền CONNECT trong cơ sở dữ liệu (tuy nhiên, quyền này có thể được lấy thông qua một nhóm khác).


0

Trong khi đây là một câu hỏi cũ tôi đã quan sát hành vi này (Trong SQL Server 2014) và tìm thấy như sau:

Đưa ra kịch bản

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

Kịch bản lệnh này sẽ tạo hai bảng được gọi là Kiểm tra.

Bảng đầu tiên CREATE TABLEtạo một bảng được gọi [MyDomain\MyAdGroupUser].[Test]và cũng tạo MyDomain\MyAdGroupUserlược đồ (cũng như MyDomain\MyAdGroupUserngười dùng cơ sở dữ liệu bị vô hiệu hóa)

cái thứ hai CREATE TABLEtạo ra một bảng gọi là[dbo].[Test]

Lý do cho điều này là vì các CREATE TABLElệnh không giải thích trạng thái lược đồ, chúng sẽ sử dụng lược đồ mặc định.

Vì chúng tôi không chỉ định lược đồ mặc định khi tạo người dùng, SQL Server đặt lược đồ mặc định của người dùng Windows là dbo nhưng KHÔNG đặt lược đồ mặc định cho người dùng Windows Group và do đó, điều này gây ra việc tạo lược đồ / người dùng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.