Berikan menolak penumpukan izin

9

Untuk peran itu db_denycustomer, saya hanya menginginkan kode kolom tabel pelanggan yang akan SELECTable, dan tidak ada yang lain. Jadi saya melakukan ini:

DENY SELECT ON dbo.customer TO db_denycustomer
GRANT SELECT ON dbo.customer (code) TO db_denycustomer

... dan itu berfungsi dengan baik. Keren! Tapi mengapa ?

Apa yang saya baca di artikel terkait adalah bahwa izin menumpuk, tetapi DENYdiutamakan. Sebaliknya, dalam kasus saya, sepertinya "izin" izin terakhir diutamakan. Benar saja, jika saya menjalankannya dalam urutan terbalik, yang terakhir DENYmenyembunyikan kolom kode juga.

Bisakah Anda jelaskan ini?

Saya juga menyertakan default db_datawriterdan db_datareaderperan ke pengguna yang saya uji.

George Menoutis
sumber

Jawaban:

10

Ini adalah perilaku yang didokumentasikan yang disediakan untuk kompatibilitas ke belakang. Kutipan dokumentasi:

Perhatian DENY tingkat-tabel tidak diutamakan daripada GRANT tingkat kolom. Ketidakkonsistenan dalam hierarki izin ini telah dipertahankan untuk kompatibilitas ke belakang.

Dan Guzman
sumber