Saya bekerja dengan MSSQL Server Management Studio 2008 dan saya perlu mengekspos pandangan kepada pihak ketiga untuk rekonsiliasi data mereka. Saya telah membuat tampilan yang sesuai, tetapi saya mengalami masalah dalam membuat pengguna dan memberikan izin yang sesuai kepada pengguna untuk memilih dari tampilan.
Saya mengikuti panduan untuk membuat login dan pengguna dan kemudian menambahkan pandangan saya di bagian Securables dengan kotak hibah dicentang untuk pilih. Semuanya tampak baik-baik saja tetapi ketika saya login sebagai pengguna itu dan mencoba melakukan "Pilih * dari MyViewName" itu memberi tahu saya bahwa izin pilih ditolak.
Saya baru saja membuat ulang pengguna (kali ini hanya menggunakan SQL, bukan wizard) dan secara eksplisit diberikan izin pilih dan sekarang itu memberi saya kesalahan: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(Saya tidak tahu mengapa ia mencoba mengakses database yang tidak terkait ...)
Saya benar-benar tidak tahu harus ke mana dari sini. Sekali lagi, pada dasarnya yang saya butuhkan adalah membuat pengguna yang dapat saya berikan kepada pihak ketiga agar mereka terhubung ke database kami dan memilih dari tampilan ini.
sumber
Jawaban:
Tolong jangan gunakan UI untuk ini. Ini kekacauan yang membingungkan.
Bagi saya itu seperti apa yang Anda inginkan adalah membuat pengguna dalam database, untuk login tertentu, yang hanya memiliki izin untuk memilih dari satu tampilan. Jadi, karena Anda sudah membuat login:
EDIT di sini adalah contoh skrip yang akan menyebabkan kesalahan yang Anda sebutkan.
Pertama, buat beberapa tabel di unrelated_db:
Sekarang buat login yang relatif terbatas:
Sekarang buat basis data tempat tampilan akan hidup, dan tambahkan login sebagai pengguna:
Sekarang buat fungsi yang akan mereferensikan tabel di database lain, dan sinonim dengan tabel lainnya:
Sekarang buat tabel lokal:
Sekarang buat tampilan yang mereferensikan tabel, fungsi dan sinonim, dan berikan
SELECT
kepadausername
:Sekarang coba jalankan sebagai
username
dan pilih hanya kolom lokal dari tampilan:Hasil:
Sekarang ubah tampilan untuk tidak mereferensikan objek eksternal, dan jalankan
SELECT
lagi di atas , dan itu berfungsi:Tanpa menunjukkan kepada kami skrip untuk Detail Pembayaran, Detail Akun, dan objek MyView, mungkin Anda dapat memberi tahu kami jika kueri ini mengembalikan hasil apa pun. Anda dapat menemukan referensi ke berbagai objek melalui tampilan katalog
sys.sql_expression_dependencies
, tetapi tampilan ini tidak sempurna - saya percaya itu tergantung pada semua tampilan yang di-refresh (dalam kasus di mana tampilan referensi tampilan lain, misalnya, atau skema yang mendasarinya telah berubah) agar untuk lebih akurat.SQL Server tidak hanya akan mencoba mengakses
unrelated_db
untuk bersenang-senang ... harus ada ikatan dengan database dari tampilan yang Anda coba gunakan. Sayangnya jika kita tidak dapat melihat definisi tampilan dan detail lebih lanjut tentang objek yang disentuhnya, yang bisa kita lakukan hanyalah berspekulasi. Dua hal utama yang dapat saya pikirkan adalah sinonim atau fungsi yang menggunakan nama tiga bagian, tetapi melihat skrip yang sebenarnya akan memberi kita ide yang jauh lebih baik daripada menebak. :-)Anda mungkin juga ingin memeriksa
sys.dm_sql_referenced_entities
, namun fungsi ini tidak mengembalikan apa pun yang berguna dalam contoh di atas.sumber
Anda dapat menguji ini dengan melakukan hal berikut:
sumber