Bagaimana memungkinkan untuk menjalankan prosedur tersimpan tetapi tidak menulis?

11

Saya ingin mengatur pengguna "membaca" pada contoh SQL Server 2012 saya. Saya ingin memberinya hak untuk menjalankan prosedur tersimpan, atau fungsi, atau pernyataan SQL langsung, yang mengambil data dari semua tabel dan tampilan, tetapi tidak untuk memperbarui atau memasukkan (yaitu membaca apa pun dan tidak menulis apa pun).

Bisakah saya mengatur ini tanpa secara khusus memberikan hak untuk setiap fungsi atau prosedur tersimpan dengan nama, tetapi memberinya eksekusi tepat pada fungsi atau prosedur tersimpan, hanya menghilangkan hak untuk mengubah tabel?

Adakah yang akan berubah jika saya menjalankan SQL Server 2008?

Klarifikasi dan tambahan:

  1. Jika prosedur tersimpan mengubah data, pengguna harus menerima pesan kesalahan (baik menolak modifikasi atau menolak akses ke prosedur tersimpan sepenuhnya).
  2. Jika solusi potensial melibatkan penolakan izin, bisakah saya tidak memberikan izin tertentu alih-alih menolak?
  3. Dapatkah penolakan diterapkan pada semua tabel, tampilan dll. (Ada sekarang dan di masa depan) dalam database dalam satu pernyataan?
gt6989b
sumber
Saya baru di sini, jangan ragu untuk mengatur tag yang sesuai dan jika tidak untuk mengedit pertanyaan
gt6989b
1
@KrisGruttemeyer itu adalah pemikirannya - dia bisa menjalankannya tetapi itu akan menghasilkan semacam kesalahan; sebagai alternatif saya tidak masalah dengan dia tidak diizinkan untuk mengeksekusinya, selama saya tidak harus menentukan daftar sp, ia memiliki hak istimewa untuk dijalankan
gt6989b
1
Dalam hal ini, Anda perlu membaca tentang izin SQL Server. Ada 3 varian izin - GRANTuntuk memberikan izin, DENYuntuk menolak izin, dan REVOKEuntuk menghapus GRANTatau DENY. Tanpa a GRANTatau DENYpengguna dapat mewarisi izin, katakanlah dari mendapatkan akses ke prosedur yang tersimpan.
JNK
1
@ gt6989b Jika Anda DENY DELETE, INSERT, UPDATEmenggunakan database atau skema, saya yakin itu hanya akan memengaruhi tabel dan tampilan.
JNK
1
@ gt6989b - Hanya mencatat bahwa jawaban yang disarankan dalam komentar ini ternyata salah. Lihat respons Paul White.
RLF

Jawaban:

15

Ini tidak semudah yang Anda bayangkan. Salah satu caranya adalah membuat peran basis data yang ditentukan pengguna baru, memberikan semua izin yang diperlukan untuk peran itu, lalu menambahkan pengguna ke peran baru. Paling tidak ini membuat lebih mudah untuk memberi pengguna (atau peran yang ditentukan pengguna lain) set izin ini di masa depan. Langkah-langkah berikut ini adalah awal yang baik:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

Setelah ini, Bob akan memiliki hak akses read-only yang luas dalam database. Dia akan dapat membaca dari semua tabel, tampilan pada tabel itu, dan fungsi in-line. Namun, dia tidak akan dapat menjalankan prosedur atau menggunakan fungsi-fungsi non-inline.

Anda perlu memberikan izin khusus kepada peran Pembaca untuk fungsi dan prosedur yang aman yang Anda inginkan untuk diakses oleh Pembaca. Mungkin ada langkah-langkah yang dapat Anda ambil untuk membuat proses ini lebih mudah (seperti mengelompokkan objek ke dalam skema dan memberikan izin eksekusi pada skema daripada objek individual) tetapi ada terlalu banyak detail untuk dibahas di sini.

Satu hal yang perlu diperhatikan adalah bahwa kurangnya hak modifikasi data tidak akan mencegah Pembaca mengubah data melalui prosedur tersimpan yang telah diberikan izin eksekusi padanya, jika prosedur dan objek yang dimodifikasi berbagi dengan pemilik yang sama. Juga tidak akan ditolak secara eksplisit dalam kasus ini. Fitur ini dikenal sebagai Chaining Kepemilikan .

Paul White 9
sumber