Saya punya contoh SQL Server 2012 dengan beberapa database. Di salah satunya saya membuat tampilan, yang memilih tabel di lebih dari database.
Saya ingin pengguna dapat memilih tampilan itu, tetapi tidak harus memilih tabelnya. Tampilan dibuat persis karena pengguna tidak dapat memilih tabel.
Saya telah membaca /programming/368414/grant-select-on-a-view-not-base-table dan http://msdn.microsoft.com/en-us/library/ms188676. aspx dan masih tidak berfungsi.
Jika saya melakukan GRANT SELECT TABLE TO USER
semua tabel, pengguna dapat memilih tampilan. Tetapi jika saya mencabut ke meja apa pun, itu gagal.
Ini harus menjadi prosedur yang mudah untuk dilakukan, tetapi saya mengalami kesulitan untuk membuatnya bekerja. Saya pernah melihatnya terjadi sebelumnya (pemilik instance memberi saya akses ke tampilan dan tidak melakukannya ke tabelnya) tetapi saya tidak dapat melakukannya atau menemukan seseorang yang tahu caranya.
Bisakah seseorang memberi saya tutorial tentang cara melakukannya, atau contoh kode?
Ketika pengguna SELECTs
melihat saya menerima pesan:
Izin SELECT ditolak pada objek
<TABLE>
, basis data<DB>
, skemadbo
.
Jika saya memberikan pilih ke tabel itu, pesan kesalahan mengubah nama tabel ke tabel lain yang dibaca oleh tampilan.
sumber
Jawaban:
Jika Anda ingin pengguna memilih dari tampilan, mengapa Anda memberikan ke meja? Maksud "mencabut" maksud Anda secara eksplisit mencabut / menolak? Tolak akan menimpa hibah sehingga ada masalah Anda ... Anda harus dapat mencapai ini dengan menambahkan hibah ke tampilan dan tidak melakukan apa pun di atas meja.
Berikut adalah contoh cepat di mana
SELECT
belum diberikan secara eksplisit di atas meja, tetapi telah di tampilan. Pengguna dapat memilih dari tampilan tetapi bukan tabel.Perhatikan bahwa asumsi
foo
ini belum diberikan hak tinggi melalui izin eksplisit pada skema atau basis data, atau melalui peran atau keanggotaan grup.Karena Anda menggunakan tabel dalam beberapa basis data (maaf saya melewatkan akhir kalimat pertama itu pada awalnya), Anda juga mungkin memerlukan hibah eksplisit pada tabel di dalam database di mana tampilan tidak ada. Untuk menghindari pemberian pilih ke tabel, Anda bisa membuat tampilan di setiap database, dan kemudian bergabung dengan tampilan.
Buat dua database dan login:
Dalam database
d1
, buat pengguna, lalu buat tabel dan tampilan sederhana terhadap tabel itu. Berikan pilihan kepada pengguna hanya terhadap tampilan:Sekarang, di database kedua, buat pengguna, lalu buat tabel lain dan tampilan yang menggabungkan tabel itu ke tampilan di
d1
. Berikan hanya pilih untuk tampilan.Sekarang luncurkan jendela permintaan baru dan ubah kredensial menjadi untuk login
blat
(EXECUTE AS
tidak berfungsi di sini). Kemudian jalankan hal berikut dari konteks basis data mana pun, dan itu akan berfungsi dengan baik:Ini seharusnya menghasilkan kesalahan Msg 229:
Hasil:
sumber
Jawaban wiki komunitas awalnya ditambahkan ke pertanyaan oleh penulisnya:
Inilah yang saya lakukan:
SELECT
akses ke pengguna pada tampilan itu, dan BUKAN ke salah satu tabelnya. Pengguna berhasil dapat meminta tampilan dan bukan tabel.SELECT
akses ke pengguna pada tampilan kedua ini, dan juga BUKAN ke tabel apa pun. Pengguna berhasil dapat meminta tampilan akhir ini dan melihat data.Saya pikir itu aneh melihat dapat query tabel dalam DB-nya bahwa pengguna tidak memiliki akses langsung tetapi tidak dapat melakukannya dalam tabel dari DB lain. Setidaknya itu berhasil.
sumber
Jika Anda mengaktifkan
Cross database ownership chaining
server, tampilan lintas basis data akan berfungsi dengan baik.https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server
keberatan risikonya
sumber