Làm thế nào mà đồng nghiệp của tôi có được lược đồ của riêng mình?


14

Tôi có một thủ tục được lưu trữ rằng:

  • kiểm tra nếu một bảng tồn tại và nếu vậy, bỏ nó.
  • tạo lại bảng đó
  • sau đó điền vào bảng đó với khoảng 30 truy vấn.

Khi tôi (Chủ sở hữu DB) chạy Proc này, mọi thứ hoạt động như dự định. Khi đồng nghiệp của tôi làm như vậy, người có quyền DROP / CREATE trên cơ sở dữ liệu này thông qua vai trò trong Active Directory, một số điều đã sai. Điều làm tôi suy nghĩ là đây:

Việc tạo bảng không có dbolược đồ được chỉ định rõ ràng trước tên. Điều này dẫn đến một bảng được gọi là domain\cowork_id.table_name_herebảng sẽ được tạo. Bên cạnh bảng được tạo trong lược đồ cá nhân của mình, giờ đây anh ta cũng có lược đồ đó trên cơ sở dữ liệu (nó không tồn tại trước khi chạy Proc).

Chuyện gì đã xảy ra? Tại sao SQL Server tạo các bảng trong lược đồ của người dùng thay vì dbokhi không được chỉ định?


Câu trả lời:


26

Theo quy tắc, bạn nên chỉ định rõ ràngdbo lược đồ nếu bạn muốn tạo đối tượng trong lược đồ này.

Như bạn là db_owner, lược đồ mặc định của bạn là dbo, vì vậy không có vấn đề gì khi bạn không chỉ định lược đồ dbo trong khi tạo đối tượng. Nhưng đối với người dùng (Windows) khác thì không giống nhau.

Người dùng của bạn là thành viên Windows groupkhông có lược đồ mặc định. Trong trường hợp này, người dùng và lược đồ tương ứng được tạo khi người dùng tạo bất kỳ đối tượng nào, nó được ghi lại ở đây: CREATE SCHema (Transact-SQL)

Lược đồ tiềm ẩn và tạo người dùng

Trong một số trường hợp, người dùng có thể sử dụng cơ sở dữ liệu mà không cần có tài khoản người dùng cơ sở dữ liệu (cơ sở dữ liệu chính trong cơ sở dữ liệu). Điều này có thể xảy ra trong các tình huống sau:

Một đăng nhập có đặc quyền ĐIỀU KHIỂN SERVER.

Người dùng Windows không có tài khoản người dùng cơ sở dữ liệu cá nhân (cơ sở dữ liệu chính trong cơ sở dữ liệu), nhưng truy cập cơ sở dữ liệu với tư cách là thành viên của nhóm Windows có tài khoản người dùng cơ sở dữ liệu (hiệu trưởng cơ sở dữ liệu cho nhóm Windows).

Khi người dùng không có tài khoản người dùng cơ sở dữ liệu tạo một đối tượng mà không chỉ định một lược đồ hiện có, một lược đồ chính và cơ sở dữ liệu mặc định sẽ được tạo tự động trong cơ sở dữ liệu cho người dùng đó. Lược đồ và sơ đồ cơ sở dữ liệu đã tạo sẽ có cùng tên với tên mà người dùng đã sử dụng khi kết nối với SQL Server (tên đăng nhập xác thực SQL Server hoặc tên người dùng Windows).

Hành vi này là cần thiết để cho phép người dùng dựa trên các nhóm Windows tạo và sở hữu các đối tượng. Tuy nhiên, nó có thể dẫn đến việc tạo ra các lược đồ và người dùng không chủ ý. Để tránh ngầm định tạo người dùng và lược đồ, bất cứ khi nào có thể rõ ràng sẽ tạo các hiệu trưởng cơ sở dữ liệu và gán một lược đồ mặc định. Hoặc nêu rõ một lược đồ hiện có khi tạo các đối tượng trong cơ sở dữ liệu, sử dụng tên đối tượng hai hoặc ba phần.

Để giải quyết vấn đề, chỉ cần gán dbolược đồ default schemacho tất cả các nhóm người dùng-Windows hoặc viết lược đồ rõ ràng khi tạo đối tượng. Luôn luôn.

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.