Bagaimana kolega saya mendapatkan skemanya sendiri?

14

Saya memiliki prosedur tersimpan yang:

  • memeriksa apakah ada tabel dan jika demikian, letakkan saja.
  • membuat tabel itu lagi
  • kemudian mengisi tabel itu dengan sekitar 30 pertanyaan.

Ketika saya (Pemilik DB) menjalankan proc ini, semuanya berfungsi sebagaimana dimaksud. Ketika rekan kerja saya melakukannya, siapa yang memiliki hak DROP / BUAT pada database ini melalui peran dalam Active Directory, beberapa hal salah. Yang mengejutkan pikiran saya adalah ini:

Pembuatan tabel tidak memiliki dboskema yang ditentukan secara eksplisit sebelum nama. Ini menghasilkan tabel yang disebut domain\cowork_id.table_name_heretabel yang akan dibuat. Selain tabel yang dibuat dalam skema pribadinya, dia sekarang juga memiliki skema itu di database (tidak ada sebelum menjalankan proc).

Apa yang terjadi? Mengapa SQL Server membuat tabel dalam skema pengguna alih-alih dboketika tidak ditentukan?

steenbergh
sumber
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Jawaban:

26

Sebagai aturan, Anda harus menentukan skema secara eksplisitdbo jika Anda ingin membuat objek dalam skema ini.

Seperti Anda db_owner, skema default Anda adalah dbo, jadi tidak ada masalah ketika Anda tidak menentukan skema dbo saat membuat objek. Tetapi untuk pengguna (Windows) lainnya tidak sama.

Pengguna Anda adalah anggota Windows groupyang tidak memiliki skema default. Dalam hal ini pengguna yang sesuai dan skema dibuat ketika pengguna membuat objek apa pun, itu didokumentasikan di sini: CREATE SCHEMA (Transact-SQL)

Skema Tersirat dan Pembuatan Pengguna

Dalam beberapa kasus, pengguna dapat menggunakan basis data tanpa memiliki akun pengguna basis data (kepala basis data dalam basis data). Ini dapat terjadi dalam situasi berikut:

Login memiliki hak istimewa CONTROL SERVER.

Pengguna Windows tidak memiliki akun pengguna basis data individual (basis data dalam basis data), tetapi mengakses basis data sebagai anggota grup Windows yang memiliki akun pengguna basis data (basis data basis untuk kelompok Windows).

Ketika pengguna tanpa basis data akun pengguna membuat objek tanpa menentukan skema yang ada, prinsip basis data dan skema default akan secara otomatis dibuat dalam database untuk pengguna tersebut. Prinsip dan skema basis data yang dibuat akan memiliki nama yang sama dengan nama yang digunakan pengguna saat menghubungkan ke SQL Server (nama login otentikasi Server SQL atau nama pengguna Windows).

Perilaku ini diperlukan untuk memungkinkan pengguna yang didasarkan pada grup Windows untuk membuat dan memiliki objek. Namun hal itu dapat mengakibatkan pembuatan skema dan pengguna yang tidak disengaja. Untuk menghindari secara tidak sengaja menciptakan pengguna dan skema, bila memungkinkan secara eksplisit membuat prinsip-prinsip basis data dan menetapkan skema default. Atau secara eksplisit nyatakan skema yang ada saat membuat objek dalam database, menggunakan nama objek dua atau tiga bagian.

Untuk mengatasi masalah ini, tetapkan dboskema default schemauntuk semua grup pengguna-Windows atau tulis skema secara eksplisit saat membuat objek. Selalu.

sepupik
sumber