BUAT DATABASE vs. BUAT izin DATABASE

21

Di Microsoft SQL Server, apa perbedaan antara CREATE DATABASEdan CREATE ANY DATABASEizin?

Saya tidak dapat menemukan jawaban yang resmi. Yang terbaik yang dapat saya simpulkan adalah bahwa (a) CREATE ANYmenyiratkan bahwa saya dapat membuat basis data untuk dimiliki oleh pengguna lain, sedangkan dengan CREATEsaya tidak dapat, atau (b) izin asli pada Sybase / awal SQL Server hari adalah CREATE ANYdan CREATEalias untuk Kesesuaian ANSI.

Tohuw
sumber
Menyuarakan apa yang dikatakan Harun, +1 tetapi Anda benar-benar harus memotong hasil edit, menempelkannya sebagai jawaban, lalu menerimanya. Dua alasan: ini mengklarifikasi apa jawabannya (dan hasil edit Anda adalah jawaban yang hebat) dan juga lebih rapi (pertanyaan yang tidak dijawab kadang-kadang terbentur ke atas untuk mendapat perhatian lebih).
Simon Righarts
1
Selesai, tapi saya tidak bisa menerimanya sampai besok, dan saya tidak bisa mengirim jawaban sama sekali kemarin (batas 5 jam untuk menjawab sendiri untuk <100 rep).
Tohuw

Jawaban:

21

Saya yakin saya telah menemukan jawaban resmi, sangat terbantu dengan tabel yang disediakan dalam artikel ini: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Tampaknya CREATE DATABASE memang merupakan izin yang sesuai dengan ANSI SQL, sedangkan CREATE ANY DATABASE adalah izin server milik MSSQL. Namun, keduanya tidak sama. Bahkan, ada perbedaan yang agak penting antara keduanya, dan saya menemukan ini dengan mencobanya.

Keduanya adalah izin, tetapi BUAT DATABASE hanya berkonsultasi konteks keamanan dari database yang saat ini digunakan, sementara BUAT DATABASE APAPUN dapat mencari daftar login pada SQL Server. Ini tampaknya dilaksanakan karena harapan umum untuk server SQL ANSI adalah bahwa izin diberikan dalam beberapa basis data sistem utama, dengan pengguna dalam basis data tersebut diberikan izin. Maka perilaku default dari database baru adalah berkonsultasi dengan master untuk melihat izin apa yang harus diwarisi. (SQL 101, saya tahu, tapi ini benar-benar dicontohkan di sini.)

Jadi, ketika Anda memberikan CREATE DATABASE, Anda harus benar-benar memiliki pengguna master untuk memberikan izin ini. Jika Anda mencoba ini, ini berhasil (buat pengguna di master, berikan itu buat basis data, maka Anda bisa membuat basis data). Namun, dengan memberikan membuat basis data apa pun (atau memberikan peran dbcreator), Anda tidak perlu menjadi pengguna literal master.

Untuk lebih menggambarkan perbedaan antara dua izin, amati pesan berbeda yang dikembalikan dengan memberikan pengguna BUAT DATABASE pada master vs database lain, lalu bilas dan ulangi untuk izin BUAT SETIAP DATABASE.

use master; GRANT CREATE DATABASE to TestUser

Msg 15151, Level 16, State 1, Line 1 Tidak dapat menemukan pengguna 'TestUser', karena tidak ada atau Anda tidak memiliki izin.

Kesalahan ini terjadi karena pengguna TestUser belum di database master. Ini adalah izin tingkat basis data - tidak memiliki konteks untuk keluar dari basis data yang dipilih dan mencari info masuk atau pengguna. Perhatikan bahwa jika Anda membuat pengguna di master terlebih dahulu, perintah ini berhasil, dan Anda dapat membuat database seperti jika BUAT DATABASE APA PUN diberikan kepada Anda.

use master; GRANT CREATE ANY DATABASE to TestUser

Perintah berhasil diselesaikan.

Ini berhasil karena, sebagai izin Microsoft SQL Server, MENCIPTAKAN DATABASE APAPUN dapat berkonsultasi dengan daftar login untuk contoh SQL, bukan hanya pengguna dalam database yang saat ini digunakan.

use test; GRANT CREATE DATABASE to TestUser

Msg 15151, Level 16, State 1, Line 1 Tidak dapat menemukan pengguna 'TestUser', karena tidak ada atau Anda tidak memiliki izin.

Ini menunjukkan konsistensi penjelasan saya untuk contoh pertama. Perhatikan kueri di bawah ini dan pesan kesalahan yang dihasilkan. Anda tidak akan menerima pesan kesalahan ini jika Anda pertama kali membuat pengguna dalam database ini (lihat permintaan terakhir).

use test; GRANT CREATE ANY DATABASE to TestUser

Msg 4621, Level 16, State 10, Line 1 Izin di lingkup server hanya dapat diberikan ketika database saat ini adalah master

Seperti yang ditunjukkan pada permintaan kedua, BUAT DATABASE APAPUN berkonsultasi dengan daftar login, di mana saya sudah membuat nama login ini. Jadi, sementara SQL Server mengakui keberadaan pengguna, itu masih kesalahan karena saya mencoba untuk memberikan izin tingkat server di tempat lain selain master, yang tidak diperbolehkan di MSSQL.

use test; create user TestUser; grant create database to TestUser

BUAT izin DATABASE hanya dapat diberikan dalam database master. Msg 0, Level 11, Negara 0, Baris 0 Terjadi kesalahan parah pada perintah saat ini. Hasilnya, jika ada, harus dibuang.

Sekarang ada pengguna untuk CREATE DATABASE untuk diterapkan, saya diberi pesan kesalahan umum bahwa Anda tidak dapat memberikan izin tingkat server di mana pun selain master, karena di situlah SQL Server menyimpan izin ini.

Yah, ini menyenangkan.

Tohuw
sumber