Bagaimana cara membuat peran server hanya baca di SQL Server 2012?

15

Saya memberikan izin "Lihat basis data apa pun" saat membuat peran server baru, tetapi menyadari izin ini hanya memungkinkan pengguna untuk melihat basis data sistem.

Saya mencoba membuat peran server yang hanya baca dan dapat membaca basis data apa pun.

Apakah ada cara untuk membuat peran server yang ditentukan pengguna untuk membaca basis data pengguna? Atau apakah saya harus melakukan ini melalui pemetaan pengguna per pengguna?

joha
sumber

Jawaban:

16

Posting ini sebagai jawaban hanya karena terlalu panjang untuk dikomentari, dan karena akan relevan untuk pengguna lain segera.

SQL Server 2014 menambahkan beberapa izin tingkat server baru yang akan membantu dengan tepat skenario jenis ini - mereka dirancang dengan mempertimbangkan audit, tetapi jenis persyaratan ini tampaknya sesuai dengan tagihan itu juga. Anda bisa menambahkan dua izin berikut ke login tingkat server:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Yang pertama, seperti kedengarannya, memungkinkan login untuk terhubung ke basis data apa pun. Hal yang menyenangkan tentang ini adalah bahwa hal itu akan memungkinkan ini bahkan untuk database yang dibuat di masa depan (asalkan Anda tidak menetapkan penolakan eksplisit, yang bagaimana Anda dapat melindungi database pengguna tertentu dari login yang memiliki izin ini). Yang terakhir memungkinkan login untuk melakukan operasi baca pada basis data apa pun yang mereka akses - sehingga mereka dapat SELECTdari tabel, tampilan, UDF, dll. Tetapi mereka tidak akan dapat melakukan UPDATEoperasi apa pun (saya belum menguji apakah izin ini memahami kapan suatu prosedur tersimpan melakukan DML). Ini bekerja sangat baik dalam kombinasi jika Anda ingin memberikan akses baca terbuka yang luas untuk seluruh server, atau agar lebih halus Anda dapat memberikan CONNECThak istimewa tradisional ke database tertentu, dan SELECT ALL USER SECURABLEShak akanhanya berfungsi untuk basis data tersebut di mana login memiliki akses eksplisit ke.

The 2014 Perubahan keamanan didokumentasikan di sini - baik, sebagian; mereka lupa tentang izin tingkat basis data ALTER ANY DATABASE EVENT SESSION- meskipun itu tidak relevan di sini.

Aaron Bertrand
sumber
Terima kasih atas jawaban yang diperluas ini untuk server yang akan datang. Menjadi bahwa operasi ini / periksa berada di tingkat server. Apakah ada komentar jika Level Kompatibilitas DB. Jadi jika DB CL 2012, apakah fitur 2014 masih berfungsi?
SnapJag
@SnapJag Tingkat kompatibilitas tidak ada kaitannya dengan fitur keamanan, sebagian besar tentang bagaimana T-SQL diurai dan bagaimana pengoptimal menghasilkan rencana kueri.
Aaron Bertrand
@AaronBertrand Tahukah Anda jika ada izin yang bisa kita atur pada peran tingkat server untuk memungkinkan pembaruan pada basis data apa pun juga? (Peran tetap sysadmin pasti, tetapi bisakah kita melakukannya untuk peran server yang ditentukan pengguna?)
MaxiWheat
@ MaxiWheat Tidak, tidak bisa memikirkan cara sepele untuk melakukan itu, maaf.
Aaron Bertrand
FWIW ini tidak akan berfungsi untuk Azure SQL Database. GRANT CONNECT SETIAP DATABASE KE [NameOfUserOrGroup] Kelas 'server' yang aman tidak didukung dalam versi SQL Server ini.
Dzejms
8

Tidak ada izin tingkat-baca 'basis data server ' dan peran tingkat-server tidak dapat diberikan izin tingkat-database

Jadi ya, Anda harus memetakan pengguna ke database secara individual. Jika Anda menggunakan Active Directory, Anda dapat membuat grup windows, lalu berikan grup itu login ke SQL Server, lalu terapkan db_datareader di semua database untuk grup itu (Anda harus membuat pengguna di setiap database).

Simon Righarts
sumber