ID Artikel: 190987 - Kajian Terakhir: 19 September 2011 - Revisi: 2.0

Cara menggunakan diperpanjang disimpan prosedur

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menjelaskan tepat penciptaan dan pelaksanaan SQL Server diperpanjang disimpan prosedur. Selain itu, artikel ini menyediakan rincian dan referensi untuk melakukan sukses implementasi SQL Server diperpanjang disimpan prosedur.

Diperpanjang disimpan prosedur adalah cara yang sangat ampuh untuk memperluas fungsi SQL Server. Berikut adalah kutipan dari SQL Server buku Online:
Diperpanjang disimpan prosedur menyediakan cara untuk secara dinamis memuat dan menjalankan fungsi dalam dynamic-link library (DLL) dengan cara yang sama untuk yang disimpan prosedur, mulus memperluas SQL Server fungsionalitas. Tindakan luar SQL Server dapat dipicu dengan mudah dan eksternal informasi kembali ke SQL Server. Kembali kode status dan output parameter (identik dengan rekan-rekan mereka secara teratur disimpan prosedur) juga didukung. SQL Server termasuk sistem yang disimpan prosedur yang menambahkan (sp_addextendedproc), drop (sp_dropextendedproc), dan memberikan informasi tentang (sp_helpextededproc) diperpanjang disimpan prosedur.
Anda harus memperlakukan diperpanjang disimpan prosedur DLL sebagai DLL lain pengembangan: berbagi kode, dan beberapa benang dapat mengaksesnya pada saat yang sama. Dengan setiap proyek production-worthy, pastikan untuk menggunakan desain teliti dan menyelesaikan pengujian.

Untuk menulis sukses diperpanjang disimpan prosedur, Anda membutuhkan pengetahuan dari banyak topik. Untuk meninjau topik ini, lihat Bab berikut dalam Windows lanjutan oleh Jeffrey Richter:
  • Bab 3, "Proses"
  • Bab 4, "Thread"
  • Bab 10, "Thread sinkronisasi"
  • Bab 12, "Dynamic-Link Libraries"
  • Bab 13, "Penyimpanan lokal Thread"
  • Bab 16, "Structured Exception Handling"
Untuk informasi lebih lanjut tentang bagaimana untuk menulis kode aman ketika Anda menggunakan diperpanjang disimpan prosedur, lihat Menulis kode aman oleh Michael Howard dan David LeBlanc. Untuk informasi lebih lanjut tentang buku ini, kunjungi Web site Microsoft berikut:
http://www.Microsoft.com/Products/info/Product.aspx?view=22&pcid=ab0cdef1-acfe-71c1-d09b-06567808e1e7 (http://www.microsoft.com/products/info/product.aspx?view=22&pcid=ab0cdef1-acfe-71c1-d09b-06567808e1e7)

Pendaftaran

Arsitektur diperpanjang disimpan prosedur ini tidak rumit; ini adalah Microsoft Visual C atau C++ kompatibel DLL yang dihubungkan dengan Opends60.lib file yang memperlihatkan fungsi benar diekspor (atau fungsi). Anda menggunakan sp_addextendedproc stored procedure untuk mendaftarkan nama fungsi diekspor dan DLL terkait. Lihat XP, xp_dblib, dan xp_odbc sampel yang dalam SQL Server Programmer Toolkit untuk contoh. Untuk mengakses SQL Server Programmer Toolkit, kunjungi halaman SQL Server pada Website Microsoft berikut:
http://www.Microsoft.com/SQL/default.mspx (http://www.microsoft.com/sql/default.mspx)
Diperpanjang disimpan prosedur yang terdaftar di dalam database master, dan administrator sistem (SA) mempertahankan kendali atas penggunaan dan pendaftaran.

Ketika Anda mendaftar Anda DLL, pastikan bahwa itu dalam sistem jalan dan mengikuti 8,3 konvensi penamaan berkas.

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
151596  (http://support.microsoft.com/kb/151596/ ) Diperpanjang prosedur kesalahan: "Tidak dapat menemukan DLL 'xxx.dll'"

Ruang alamat

SQL Server menggunakan LoadLibrary, GetModuleHandle, dan GetProcAddress untuk mendapatkan pointer ke fungsi yang diekspor, dan kemudian melewati fungsi struktur SRVPROC. Setelah DLL menerima struktur SRVPROC, Anda dapat melakukan operasi terbuka layanan Data standar untuk mendapatkan parameter dan memberikan hasil kepada si pemanggil.

Sebagai DLL, dibuka di ruang alamat proses panggilan. Dalam kasus disimpan prosedur diperpanjang, proses adalah SQL Server. Jika DLL tidak benar mengakses memori atau jika tidak aman benang, Anda dapat mempengaruhi proses. Anda harus melakukan pengujian menyeluruh untuk memastikan bahwa DLL mempertahankan integritas dari proses. Jika Anda prihatin sekali bahwa prosedur disimpan diperpanjang mungkin menjadi negatif mempengaruhi SQL Server, Anda harus mengatasi masalah ini segera.

Sebagai contoh, Anda dapat menggunakan Microsoft Visual C atau Microsoft Visual C++ wizards untuk membuat DevStudio Add-in Wizard. Wizard ini adalah dalam proses COM server, atau DLL. Jika Anda tidak menulis wizard Anda dengan benar, itu dapat mempengaruhi proses.

Contoh

   char strName[31] = "";
   strncpy(strName, "Bob", 35); //  <-- Incorrect length
				
Dalam contoh ini, Anda salah menyalin data melewati akhir strName buffer. Dokumentasi strncpy rutin menyatakan bahwa itu akan menyalin string kedua ke strName parameter, dan kemudian nol mengisi sisa buffer. Oleh karena itu, contoh adalah menulis 35 byte, bahkan ketika kedua string adalah 3 byte panjangnya. The strncpy rutin yang kemungkinan besar tidak akan menyebabkan pelanggaran akses karena Anda masih di ruang alamat proses. Namun, operasi mungkin telah dengan mudah rusak memori internal struktur, yang akan menyebabkan perilaku tak terduga proses. Dari proses SQL Server, jenis kesalahan mungkin merusak struktur SQL Server internal yang kritis, dan, dengan demikian, mungkin menunjukkan dirinya melalui koneksi menjatuhkan atau perilaku SQL Server lain tak terduga. Selain itu, server mungkin berhenti merespons.

SQL Server mencoba untuk melindungi ruang alamat. Doa diperpanjang disimpan prosedur dibungkus dalam mencoba / kecuali blok, dan banyak poin dalam kode melakukan minimal runtime memeriksa kebenaran. Hal ini penting untuk diingat bahwa perlindungan disediakan oleh mencoba / kecuali blok dan tidak oleh try/catch blok. Oleh karena itu, kode tidak akan tampil unwinding tumpukan untuk objek.

Kebocoran memori

Setiap proyek mungkin memiliki masalah di mana memori dialokasikan, menangani, atau sumber daya yang serupa tidak sedang dirilis dengan benar. Itu sangat penting untuk setiap DLL test suite suite akan memastikan bahwa DLL adalah melepaskan semua sumber dengan benar. Jenis masalah mungkin untuk menunjukkan diri mereka sebagai peningkatan halaman file penggunaan, kinerja berubah, atau peningkatan paging.

Thread keselamatan

Aplikasi seperti Microsoft Internet Information Server (IIS) dan Microsoft SQL Server adalah benang penggabungan, multi-threaded aplikasi. Ini berarti bahwa Anda dapat memulai DLL Anda dari beberapa sambungan pada saat yang sama, terutama pada komputer yang memiliki multiprosesor. Ini juga berarti bahwa sambungan tunggal dapat memohon titik entri yang berbeda DLL (XPROC, ISAPI) dari thread pekerja yang berbeda. Thread penggabungan dapat membatasi kegunaan variabel Thread penyimpanan lokal (TLS).

Pastikan bahwa semua kode jalan aman benang dan re-entrant dengan menghubungkan dengan perpustakaan run-time multi-threaded, dan dengan memastikan bahwa semua vendor dll yang Anda gunakan benang-aman.

Untuk informasi lebih lanjut tentang benang penyimpanan lokal dan rinci tentang isu-isu keselamatan thread, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
163449  (http://support.microsoft.com/kb/163449/ ) Penggunaan Thread penyimpanan lokal di diperpanjang disimpan prosedur

Struktur pengecualian penanganan

Anda harus juga jelas memahami kesalahan structured exception handling. Setiap titik masuk dalam DLL harus menjelaskan baik pengecualian kesalahan. SQL Server mencoba untuk menangkap pengecualian kesalahan tetapi setiap DLL telah menangkap dan menangani pengecualian kesalahan dengan benar. Secara khusus, setiap benang yang mulai di DLL harus menginstal structured exception kesalahan Handler.

Setiap benang dalam proses telah tumpukan pengecualian. Namun, jika DLL mulai thread baru, dimulai dengan pengecualian telanjang. Jika kain tidak menginstal mencoba / kecuali atau try/catch blok segera, thread hanya dilindungi oleh sistem operasi. Kesalahan pengecualian yang benang pertemuan dianggap unhanded dan fatal bagi seluruh proses. Ingat, DLL di ruang proses pemanggil dan masalah jenis ini akan menyebabkan pengecualian fatal untuk proses.

SQL Server dan komponen terkait SQL Server dihubungkan dengan versi runtime DLL. Setiap diperpanjang disimpan prosedur yang Anda mengembangkan juga dapat dihubungkan dengan versi runtime DLL.

Koneksi loopback menuju

Koneksi loopback dibuat ketika diperpanjang disimpan prosedur membuat sambungan ke komputer yang sama yang menjalankan SQL Server. Ini dijelaskan dalam xp_dblib dan xp_odbc sampel, yang disertakan dengan SQL Server Programmer Toolkit.

Anda hanya dapat melakukan koneksi loopback menuju pada sesi terikat. Satu masalah dengan koneksi loopback adalah bahwa itu adalah sambungan baru dan karena itu di ruang yang terpisah transaksi. Misalnya, disimpan prosedur diperpanjang melakukan perhitungan matematika yang kompleks pada tabel penjualan. Koneksi loopback mencoba untuk menyelesaikan pernyataan pilih pada tabel penjualan. Namun, koneksi asli telah dilakukan UPDATE pernyataan untuk Penjualan tabel. Kecuali Anda telah rajin perawatan untuk melaksanakan timeout permintaan, melakukan asynchronous permintaan pengolahan, dan memeriksa SRV_GOTATTENTION, hubungan ini mungkin memblokir itu sendiri.
SQL Server 6,5 dan kemudian membangun SQL Server mendukung koneksi terikat. Lihat srv_getbindtoken dan sp_bindsession untuk rincian pelaksanaan. Mengikat koneksi loopback untuk koneksi asli tempat kedua sambungan dalam ruang transaksi yang sama. Ini berarti bahwa blok yang awalnya terjadi di Penjualan tabel dapat dihindari.

Catatan SQL Server hanya mendukung koneksi loopback menuju pada sesi terikat.

Untuk informasi lebih lanjut tentang masalah pemblokiran, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
162361  (http://support.microsoft.com/kb/162361/ ) Memahami dan memecahkan masalah pemblokiran 6.x SQL Server
180775  (http://support.microsoft.com/kb/180775/ ) Klien efek pada throughput SQL Server

Kesalahan dan pesan

Sisi lain dari koneksi loopback atau diperpanjang disimpan prosedur yang membuat sambungan ke komputer lain yang menjalankan SQL Server atau ke layanan Data terbuka gateway adalah penanganan kesalahan dan pesan.

Jika Anda menggunakan DB-perpustakaan, Anda harus menggunakan per proses kesalahan dan pesan Handler. SQL Server mengontrol penangan global pesan dan diperpanjang prosedur yang disimpan tidak harus menggantinya. Setiap proses kesalahan dan pesan penangan juga dijamin benang-aman. Lihat dbprocmsghandle dan dbprocerrhandle untuk rincian lengkap.

Petunjuk Menginstalnya di LOGINREC sebelum menelepon dbopen.

Untuk informasi lebih lanjut tentang batasan penggunaan DB-perpustakaan di lingkungan diperpanjang, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
174817  (http://support.microsoft.com/kb/174817/ ) Microsoft SQL Server DB-perpustakaan memiliki terbatas diperpanjang
Dengan panggilan terbuka Data Services API srv_message_handler, Anda dapat menempatkan teks di log kesalahan SQL Server. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
164290  (http://support.microsoft.com/kb/164290/ ) FIX: Srv_message_handler teks batas
Satu catatan terakhir tentang perpustakaan DB kesalahan handler: Anda dapat kembali INT_EXIT nilai dari fungsi callback yang diinstal. Namun, sebagai didokumentasikan, menyebabkan aplikasi untuk keluar. Ini berarti bahwa Anda memerintahkan proses untuk keluar. Oleh karena itu, itu harus tidak disebut dari DLL karena dari efek untuk aplikasi seperti IIS atau SQL Server.

Transact-SQL KILL

Aspek lain dari koneksi loopback atau diperpanjang disimpan prosedur eksekusi pada umumnya adalah penggunaan pernyataan Transact-SQL membunuh. Karena pernyataan membunuh adalah Transact-SQL berbasis, layanan Data terbuka saat ini API set tidak memiliki pengetahuan tentang status Transact-SQL membunuh. Diperpanjang disimpan prosedur harus mencari SRV_GOTATTENTION sehingga dapat menangani permintaan dari klien untuk membatalkan pengoperasian. Namun, SA saat ini tidak dapat mengeluarkan pernyataan Transact-SQL membunuh untuk mengganggu pelaksanaan prosedur disimpan diperpanjang. Hal ini lebih penting bahwa Anda dengan benar menggunakan koneksi terikat dan baik pengkodean praktek. Desain perubahan permintaan (DCR) telah diajukan dengan SQL Server development untuk memperluas fungsi Transact-SQL membunuh pernyataan diperpanjang disimpan prosedur.

Pengaturan global

Pernah mempengaruhi global negara proses dari DLL. Sebagai contoh, SQL Server khusus panggilan Win32 API panggilan SetErrorMode untuk mengatur perilaku yang diinginkan. Diperpanjang disimpan prosedur harus tidak pernah menelepon SetErrorMode atau lain proses panggilan global karena ini untuk proses ruang. Ada beberapa panggilan yang mempengaruhi secara global proses; Pastikan bahwa DLL tidak menggunakan panggilan ini.

Selain itu, tertentu terbuka Data Services (ODS) panggilan dirancang untuk digunakan dalam aplikasi berbasis ODS dan tidak boleh digunakan dalam diperpanjang disimpan prosedur. Ini termasuk panggilan seperti srv_init, srv_config, srv_handle dan srv_errhandle. Memanggil fungsi-fungsi ini mengabaikan nilai-nilai yang menginstal SQL Server dan dapat menyebabkan kondisi tak terduga kegagalan.

Srv_Senddone

Secara default, SQL Server secara otomatis panggilan srv_senddone diperpanjang disimpan prosedur dengan bendera SRV_DONE_FINAL kembali dari doa diperpanjang disimpan prosedur. Harus disimpan prosedur diperpanjang tidak panggilan srv_senddone dengan bendera SRV_DONE_FINAL; Sebaliknya, itu harus menggunakan bendera SRV_DONE_MORE.

String penghentian

Ketika Anda berurusan dengan string yang kembali dari API layanan Data yang terbuka, Anda harus selalu memastikan bahwa penghentian terjadi. String yang kembali dari srv_paramdata diperpanjang disimpan prosedur tidak dijamin NULL dihentikan. Anda harus menggunakan srv_paramlen Extended stored procedure untuk benar memanipulasi string. Fungsi-fungsi layanan Data terbuka lain mungkin mirip; menguji mereka secara menyeluruh.

REFERENSI

Richter, Jeffrey. Windows lanjutan. Redmond, WA: Microsoft Press, 1997

Howard, Michael dan David LeBlanc. Menulis kode aman, edisi kedua. Redmond, WA: Microsoft Press, 2002.

Berlaku bagi:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 64-bit Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
Kata kunci: 
kbhowtomaster kbprogramming kbmt KB190987 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:190987  (http://support.microsoft.com/kb/190987/en-us/ )