Saya minta maaf jika pertanyaan ini mengulangi pertanyaan lain yang sudah diajukan. Saya telah mencari selama berjam-jam dan belum menemukan satu yang cocok dengan situasi saya.
Hasil yang diinginkan
Seorang pengguna yang menggunakan otentikasi SQL telah menjalankan izin untuk Database1 pada Server1 (contoh default) dan hanya itu. Pengguna menjalankan prosedur tersimpan yang, sebagai bagian dari prosesnya, mengakses Database 2 di Server1 \ Instance2. Saya ingin ini aman dan sederhana (keduanya penting).
Info lebih lanjut
Kredensial windows saya memiliki akses ke kedua instance (yang berada di server yang sama). Oleh karena itu, saya dapat menjalankan prosedur tersimpan di bawah login saya tanpa kesulitan. Namun, saya tidak ingin memberikan tingkat akses kepada pengguna. Saya juga perlu menggunakan login SQL karena pengguna tidak akan berada di domain.
Apa yang saya inginkan adalah memberikan prosedur yang tersimpan tingkat akses saya hanya untuk prosedur itu. Karena saya seorang sysadmin, itu akan memberi pengguna semua yang mereka butuhkan untuk prosedur itu. Jika saya berhasil, saya mungkin akan membuat akun hanya untuk tujuan itu daripada menggunakan milik saya, tetapi bagaimanapun juga itu akan aman karena saya mengontrol apa yang dilakukan oleh proc yang disimpan.
Saya mencoba meletakkan pernyataan "DENGAN EXECUTE AS" di proc saya yang tersimpan tetapi saya tidak bisa mendapatkannya untuk mengambil informasi login windows saya. Ketika saya memasukkannya, saya akan mendapatkan kesalahan berikut setelah mengkompilasi proc yang disimpan:
Tidak dapat mengeksekusi sebagai pengguna 'domain \ jdoe', karena tidak ada atau Anda tidak memiliki izin.
Pengguna adalah sysadmin di kedua server, seperti yang saya katakan, jadi saya tidak yakin apa lagi yang dibutuhkan.
Saya telah melihat yang berikut ini:
- TRUSTED - Saya lebih suka tidak mengekspos database saya dan ini terlihat menakutkan
- Server yang ditautkan - Saya tidak ingin memberikan izin tambahan. Saya tidak percaya database lain untuk memiliki akses ke database saya dan saya tidak percaya database saya untuk memiliki akses ke semua database lain.
- Sertifikat - Ini sepertinya rumit dan sulit. Kecuali saya dapat menemukan cara yang sangat sederhana untuk melakukan ini dan memeliharanya, saya tidak yakin itu sepadan dengan masalahnya.
- Rantai kepemilikan - Sekali lagi, menakutkan. Sepertinya ini menyebabkan lebih banyak masalah keamanan ketika tujuan saya adalah untuk mencegah masalah keamanan.
- Pengguna yang dicerminkan - Saya bahkan telah membuat pengguna yang sama (berbeda SID) pada contoh server lain dan memberikannya kata sandi yang sama. Tidak pergi.
Saya merasa kehilangan sesuatu yang jelas tapi saya tidak yakin apa itu. Karena saya telah membenturkan kepala ke dinding sepanjang hari ini, saya mungkin terlalu dekat untuk melihatnya. Saya akan sangat menghargainya jika seseorang di sini dapat membantu saya atau mengarahkan saya ke arah yang benar. Saya akan mengatakan bahwa saya telah membaca banyak artikel MSDN (anak laki-laki saya benci mereka - mereka sepertinya tidak pernah memberi tahu saya apa yang ingin saya ketahui). Apa yang saya benar-benar suka adalah tutorial sederhana, mudah diikuti yang menuntun saya melalui cara melakukan ini. Singkatnya, bahkan indikasi umum tentang arah yang harus saya tuju akan sangat membantu.
sumber
Lihatlah menggunakan
EXECUTE AS
+ Dapat Dipercaya. Anda dapat mengaturnya di mana ia dapat dipanggil dalam prosedur tersimpan selama pengguna b telah diberikan akses dan dua basis data saling percaya.Blog orang ini harus menjawab atau memberikan semua yang Anda butuhkan. http://www.sommarskog.se/grantperm.html#EXECAScrossdb
http://msdn.microsoft.com/en-us/library/ms188304%28v=sql.90%29.aspx
sumber
Setelah membaca banyak tentang topik ini dan melakukan sejumlah percobaan, saya yakin saya telah sampai pada kesimpulan tentang masalah ini. Pernyataan EXECUTE AS tidak dirancang untuk bekerja lintas contoh tanpa implikasi keamanan besar. Apa yang saya harapkan adalah cara untuk memberi tahu prosedur saya tentang identitas Windows yang ingin saya jalankan, karena identitas Windows dapat memiliki akses ke banyak sumber daya pada beberapa server. Namun, bahkan setelah bermain-main dengan sekelompok pengaturan yang berbeda, menjadi jelas bahwa saya harus melemahkan langkah-langkah keamanan lainnya untuk memungkinkan prosedur yang tersimpan meniru saya.
Tampaknya tidak ada banyak informasi di luar sana tentang prosedur lintas-contoh atau lintas-server. Saya akan membayangkan alasan untuk ini adalah karena implikasi keamanan dan kinerja melakukannya. Namun, saya percaya ada kasus di mana itu penting dan sepertinya solusi untuk melakukannya adalah rumit dan sangat khusus untuk skenario. Saya menemukan artikel bagus yang setidaknya membantu saya memahami beberapa pilihan saya. Itu tidak fokus pada akses lintas-contoh tetapi itu memberi saya petunjuk yang saya cari. Saya mendorong Anda untuk memeriksanya:
http://www.sommarskog.se/grantperm.html
Saya masih akan tertarik pada solusi lain untuk masalah ini, tetapi solusi saya sekarang adalah dua kali lipat. Pertama, jika saya benar-benar perlu mengakses dua database melalui satu prosedur tersimpan, saya harus menggunakan login Windows. Saya menghindari hal ini sedapat mungkin, karena hal itu menyebabkan masalah kinerja (penguncian multi-server, komplikasi jaringan, ketidakmampuan untuk mengoptimalkan kueri, dll.) Kedua, saya membawa data dari setiap basis data melalui panggilan terpisah, khusus basis data. Itu berarti saya membawa data kembali ke klien sebelum menggabungkannya. Ini bukan sebagai pemain atau bersih seperti yang saya inginkan, tetapi tampaknya menjadi solusi teraman.
sumber
Jika Anda perlu mengakses objek database antara dua instance SQL server, saya akan merekomendasikan salah satu dari yang berikut:
sumber