Aracılığıyla paylaş


Programlama Veritabanı Motoru Genişletilmiş Depolanmış İşlemler

Şunlar için geçerlidir: SQL Server

Önemli

Bu özellik, SQL Server'ın gelecek bir sürümünde kaldırılacaktır. Bu özelliği yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bu özelliği kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine CLR entegrasyonunu kullanın.

Genişletilmiş depolanmış prosedürlerin nasıl çalıştığı

Genişletilmiş bir depolanmış prosedürün işlediği süreç şudur:

  1. Bir istemci genişletilmiş bir depolanmış prosedürü çalıştırdığında, istek istemci uygulamadan SQL Server'a tablolu veri akışı (TDS) veya Basit Nesne Erişim Protokolü (SOAP) formatında iletilir.

  2. SQL Server, genişletilmiş depolanmış prosedürle ilişkili DLL'yi arar ve DLL zaten yüklenmemişse yükler.

  3. SQL Server, istenen genişletilmiş depolanmış prosedürü çağırır (DLL içinde bir fonksiyon olarak uygulanmıştır).

  4. Genişletilmiş depolanmış prosedür, sonuç kümelerini ve dönüş parametrelerini Genişletilmiş Depolanmış İşlem API'si aracılığıyla sunucuya geri iletir.

Geçmişte, Açık Veri Servisleri, SQL Server dışı veritabanı ortamlarına açılan geçit gibi sunucu uygulamaları yazmak için kullanılıyordu. SQL Server, Açık Veri Hizmetleri API'sinin eski bölümlerini desteklemiyor. SQL Server tarafından desteklenen orijinal Açık Veri Hizmetleri API'sinin tek kısmı genişletilmiş depolanmış prosedür fonksiyonlarıdır, bu nedenle API Genişletilmiş Depolanmış Prosedür API olarak yeniden adlandırılmıştır.

Dağıtık sorguların ve CLR entegrasyonunun ortaya çıkmasıyla birlikte, Genişletilmiş Depolanmış İşlem API uygulamalarına olan ihtiyaç büyük ölçüde yerini değiştirmiştir.

Mevcut gateway uygulamalarınız varsa, SQL Server ile gelen uygulamaları opends60.dll çalıştırmak için kullanamazsınız. Gateway uygulamaları artık desteklenmemektedir.

Genişletilmiş depolanmış prosedürler vs. CLR entegrasyonu

CLR entegrasyonu, Transact-SQL'de ifade edilmesi zor veya imkansız olan sunucu tarafı mantığı yazmaya daha sağlam bir alternatif sunar. SQL Server'ın önceki sürümlerinde, genişletilmiş depolama prosedürleri (XP'ler) veritabanı uygulama geliştiricilerinin bu tür kodu yazabilmeleri için mevcut olan tek mekanizmayı sağlıyordu.

CLR entegrasyonunda, eskiden depolanmış prosedürler şeklinde yazılan mantık genellikle tablo değerli fonksiyonlar olarak daha iyi ifade edilir; bu fonksiyonun oluşturduğu sonuçların cümle içine gömmekle ifadelerde SELECTFROM sorgulanmasına olanak tanır.

Daha fazla bilgi için CLR entegrasyon genel büzemine bakınız.

Genişletilmiş depolanmış prosedürlerin yürütme özellikleri

Genişletilmiş bir depolanmış prosedürün yürütülmesi şu özelliklere sahiptir:

  • Genişletilmiş depolanmış prosedür fonksiyonu, SQL Server güvenlik bağlamında çalıştırılır.

  • Genişletilmiş depolanmış prosedür fonksiyonu, SQL Server'ın işlem alanında çalışır.

  • Genişletilmiş depolanmış prosedürün yürütülmesiyle ilişkili iş parçacığı, istemci bağlantısı için kullanılan iş dişidir.

Önemli

Sunucuya genişletilmiş depolanmış prosedürler eklemeden ve diğer kullanıcılara çalıştırma izinleri vermeden önce, sistem yöneticisi her genişletilmiş depolanmış prosedürü zararlı veya zararlı kod içermediğinden emin olmak için detaylı incelemelidir.

Genişletilmiş depolanmış prosedür DLL yüklendikten sonra, DLL SQL Server durdurulana veya yönetici DLL'yi açıkça kaldırana DBCC <DLL_name> (FREE)kadar sunucunun adres alanında yüklü kalır.

Genişletilmiş depolanmış prosedür, şu ifadeyle EXECUTE Transact-SQL tarafından saklanan bir prosedür olarak çalıştırılabilir:

EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;

Parametreler

@ Retval

Bir iade değeri.

@ param1

Bir giriş parametresi.

@ param2

Bir giriş/çıkış parametresi.

Dikkat

Genişletilmiş depolanmış prosedürler performans artışları sunar ve SQL Server işlevselliğini genişletir. Ancak, genişletilmiş depolanmış prosedür DLL ve SQL Server aynı adres alanını paylaştığı için, bir sorunlu prosedür SQL Server işleyişini olumsuz etkileyebilir. Genişletilmiş depolanmış prosedür DLL'nin getirdiği istisnalar SQL Server tarafından yönetilse de, SQL Server veri alanlarına zarar vermek mümkündür. Güvenlik önlemi olarak, yalnızca SQL Server sistem yöneticileri SQL Server'a genişletilmiş depolanmış prosedürler ekleyebilir. Bu prosedürler kurulmadan önce kapsamlı şekilde test edilmelidir.

Genişletilmiş Kayıtlı İşlem API'si ile sunucuya sonuç setleri gönderin

SQL Server'a bir sonuç kümesi gönderilirken, genişletilmiş depolanmış prosedür uygun API'yi aşağıdaki gibi çağırmalıdır:

  • Fonksiyon, srv_sendmsg tüm satırlar (varsa) ile srv_sendrowolmadan önce veya sonra herhangi bir sırayla çağrılabilir. Tüm mesajlar, tamamlanma durumu ile srv_senddonegönderilmeden önce istemciye gönderilmelidir.

  • Fonksiyon, srv_sendrow istemciye gönderilen her satır için bir kez çağrılır. Tüm satırlar, herhangi bir mesaj, durum değerleri veya tamamlanma durumları ile srv_sendmsgsrv_status gönderilmeden önce istemciye gönderilmelidir, argümanı srv_pfieldile , veya srv_senddone.

  • Tüm sütunları tanımlanmamış srv_describe bir satır göndermek, uygulamanın bilgilendirici bir hata mesajı oluşturup istemciye geri FAIL dönmesine neden olur. Bu durumda, tartışma gönderilmiyor.

Genişletilmiş depolanmış prosedürler oluşturun

Genişletilmiş bir depolanmış prosedür, prototipi olan bir C/C++ fonksiyonudur:

SRVRETCODE xp_extendedProcName (SRVPROC *);

Ön eki xp_ kullanmak isteğe bağlıdır. Genişletilmiş depolanmış prosedür adları, sunucuda kurulmuş kod sayfası/sıralama sırasına bakılmaksızın, Transact-SQL ifadelerinde referans alındığında büyük harf duyarlıdır. Bir DLL oluştururken:

  • Giriş noktası gerekiyorsa, bir DllMain fonksiyon yazın.

    Bu fonksiyon isteğe bağlıdır. Eğer bunu kaynak kodda sağlamazsanız, derleyici kendi sürümünü bağlar, bu da sadece geri TRUEdöndürer. Bir DllMain fonksiyon sağlarsanız, işletim sistemi bu fonksiyonu çağırır; bir iş parçacığı veya süreç DLL'ye bağlandığında veya ayrıldığında.

  • DLL dışından çağrılan tüm fonksiyonlar (tüm genişletilmiş depolanmış prosedür Efonksiyonları) dışa aktarılmalıdır.

    Bir fonksiyonu dosyanın bölümünde adını listeleyerek EXPORTS aktarabilir veya kaynak koddaki fonksiyon adını ön ekleyerek __declspec(dllexport), Microsoft derleyici uzantısı (__declspec()iki alt çizgiyle başlar) ile önekleyebilirsiniz..def

Bu dosyalar, genişletilmiş bir depolanmış prosedür DLL oluşturmak için gereklidir.

Dosya Description
srv.h Genişletilmiş Kayıtlı İşlem API başlık dosyası
opends60.lib Kütüphaneyi içe aktar opends60.dll

Genişletilmiş bir depolanmış prosedür DLL oluşturmak için, Dynamic Link Library tipinde bir proje oluşturun. DLL oluşturma hakkında daha fazla bilgi için geliştirme ortamı dokümantasyonuna bakınız.

Tüm genişletilmiş depolanmış prosedür DLL'leri aşağıdaki fonksiyonu uygulamalı ve dışa aktarmalıdır:

__declspec(dllexport) ULONG __GetXpVersion()
{
   return ODS_VERSION;
}

__declspec(dllexport) Microsoft'a özgü bir derleyici uzantısıdır. Derleyiciniz bu direktifi desteklemiyorsa, bu fonksiyonu DEF dosyanızda bölüm EXPORTS altındaki dışa aktarmalısınız.

SQL Server iz bayrağı -T260 ile başlatıldığında veya sistem yöneticisi ayrıcalıklarına sahip bir kullanıcı çalıştırıldığında DBCC TRACEON (260)ve genişletilmiş depolanmış prosedür DLL desteklemiyorsa __GetXpVersion(), hata loguna aşağıdaki uyarı mesajı yazılır (__GetXpVersion() iki alt çizgiyle başlar).

Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().

Genişletilmiş depolanmış prosedür DLL dışa aktarıyorsa __GetXpVersion(), ancak fonksiyonun geri dönen versiyonu sunucunun gerektirdiği sürümden küçükse, fonksiyonun döndüren versiyonu ve sunucunun beklediği sürümü belirten bir uyarı mesajı hata günlüğüne yazdırılır. Bu mesajı alırsanız, yanlış bir değer döndürüyorsunuz __GetXpVersion()ya da eski bir sürümüyle srv.hderliyorsunuz.

Uyarı

SetErrorMode, bir Win32 fonksiyonu, genişletilmiş depolanmış prosedürlerde çağrılmamalıdır.

Uzun süreli genişletilmiş depolanmış prosedürler periyodik olarak çağrılmalıdır srv_got_attention , böylece bağlantı kesildiğinde veya toplu iptal edilirse prosedür kendini sonlandırabilir.

Genişletilmiş bir depolanmış prosedür DLL'sini hata ayıklamak için SQL Server \Binn dizinine kopyalayın. Hata ayıklama oturumu için çalıştırılabilir dosyayı belirtmek için, SQL Server yürütülebilir dosyasının yolunu ve dosya adını girin (örneğin, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Argümanlar hakkında sqlservr bilgi için sqlservr Uygulaması'na bakınız.

SQL Server'a genişletilmiş bir depolanmış prosedür ekleyin

Genişletilmiş depolanmış prosedür fonksiyonları içeren bir DLL, SQL Server'a bir uzantı olarak hizmet verir. DLL'yi kurmak için, dosyayı standart SQL Server DLL dosyalarını içeren bir dizine kopyalayın (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn varsayılan olarak).

Genişletilmiş depolanmış prosedür DLL'si sunucuya kopyalandıktan sonra, SQL Server sistem yöneticisi DLL'deki her genişletilmiş depolanmış prosedür fonksiyonunu SQL Server'a kaydetmelidir. Bu, sistem depolanan prosedür kullanılarak sp_addextendedproc yapılır.

Önemli

Sistem yöneticisi, genişletilmiş bir depolanmış prosedürü kapsamlı bir şekilde inceleyerek zararlı veya zararlı kod içermediğinden emin olmalı, sonra onu sunucuya ekleyip diğer kullanıcılara yürütme izinleri vermelidir. Tüm kullanıcı girişlerini doğrulayın. Kullanıcı girdisini doğrulamadan önce birleştirmeyin. Hiçbir zaman, karşılanmamış kullanıcı girişinden hazırlanmış bir komutu yürütmeyin.

Birinci sp_addextendedproc parametre fonksiyonun adını, ikinci parametre ise o fonksiyonun bulunduğu DLL'nin adını belirtir. DLL'nin tam yolunu belirtmelisiniz.

Uyarı

Tam bir yola kayıtlı olmayan mevcut DLL'ler, SQL Server 2005 (9.x) veya daha sonraki sürümlere yükseltildikten sonra çalışmaz. Sorunu düzeltmek için sp_dropextendedproc DLL'yi kayddan çıkarabilir ve ardından tam yolu belirterek yeniden kaydedersiniz sp_addextendedproc, .

Belirtilen sp_addextendedproc fonksiyonun adı, durum dahil olmak üzere, DLL'deki fonksiyonun adı ile tam olarak aynı olmalıdır. Örneğin, bu komut, bir dll'de bulunan bir fonksiyonu, xp_hello.dllSQL Server genişletilmiş bir depolanmış prosedür olarak kaydederxp_hello,:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';

Eğer belirtilen sp_addextendedproc fonksiyonun adı DLL'deki fonksiyon adıyla tam olarak eşleşmiyorsa, yeni ad SQL Server'da kayıtlıdır ama isim kullanılabilir değildir. Örneğin, xp_Hello SQL Server genişletilmiş bir depolanmış prosedür xp_hello.dllolarak kayıtlı olsa da, SQL Server fonksiyonu daha sonra çağırırsanız xp_Hello DLL'de fonksiyonu bulamaz.

-- Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll';

-- Use the newly registered name to call the function
DECLARE @txt VARCHAR(33);
EXEC xp_Hello @txt OUTPUT;

Hata iletisi şu şekildedir:

Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).

Eğer belirtilen sp_addextendedproc fonksiyonun adı DLL'deki fonksiyon adıyla tam olarak eşleşiyorsa ve SQL Server örneğinin derlemesi becereğe duyarsızsa, kullanıcı genişletilmiş depolanmış prosedürü ismin küçük ve büyük harflerinin herhangi bir kombinasyonunu kullanarak çağırabilir.

-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';

-- The following example succeeds in calling xp_hello
DECLARE @txt VARCHAR(33);
EXEC xp_Hello @txt OUTPUT;

DECLARE @txt VARCHAR(33);
EXEC xp_HelLO @txt OUTPUT;

DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;

SQL Server örneğinin karşılaştırılması büyük harf hassasiyetli olduğunda, SQL Server farklı bir durumla çağrıldığında genişletilmiş depolanmış prosedürü çağıramaz. Bu, DLL'deki fonksiyonla tam olarak aynı isim ve derleme ile kayıtlı olsa bile geçerlidir.

-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';

-- The following example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;

Hata iletisi şu şekildedir:

Server: Msg 2812, Level 16, State 62, Line 1

SQL Server'ı durdurup yeniden başlatmanıza gerek yok.

SQL Server'da yüklenmiş genişletilmiş depolanmış prosedürleri sorgulamak

SQL Server tarafından doğrulanmış bir kullanıcı, sistem prosedürünü sp_helpextendedproc çalıştırarak mevcut tanımlanmış genişletilmiş depolanmış prosedürleri ve her birinin ait olduğu DLL'nin adını gösterebilir. Örneğin, aşağıdaki örnek, ait olduğu DLL'yi xp_hello geri getirir:

sp_helpextendedproc 'xp_hello';

Eğer sp_helpextendedproc genişletilmiş bir depolanmış prosedür belirtilmeden çalıştırılırsa, tüm genişletilmiş depolanmış prosedürler ve DLL'leri görüntülenir.

SQL Server'dan genişletilmiş bir depolanmış prosedürü kaldırın

Kullanıcı tanımlı genişletilmiş depolanmış prosedür DLL'sinde her genişletilmiş depolanmış prosedür fonksiyonunu bırakmak için, SQL Server sistem yöneticisi sp_dropextendedproc sistem depolanmış prosedürü çalıştırmalı ve fonksiyonun adını ve o fonksiyonun bulunduğu DLL'nin adını belirtmelidir. Örneğin, bu komut xp_helloSQL Server'dan adlandırılmış xp_hello.dll, bir DLL'de bulunan fonksiyonu kaldırır:

sp_dropextendedproc 'xp_hello';

sp_dropextendedproc Sistem genişletilmiş depolanmış prosedürleri düşürmez. Bunun yerine, sistem yöneticisi, genişletilmiş depolanmış prosedür için izin verilmesini kamuya açık role indirmelidirEXECUTE.

Genişletilmiş bir depolanmış prosedür DLL'sini boşaltma

SQL Server, DLL'nin fonksiyonlarından birine çağrı yapıldığı anda genişletilmiş bir depolanmış prosedür DLL'sini yükler. DLL, sunucu kapatılana veya sistem yöneticisi bu DBCC açıklamayı kullanarak onu kaldırana kadar yüklü kalır. Örneğin, bu komut xp_hello.dllsistem yöneticisinin dosyanın yeni bir sürümünü dizine kopyalamasını sağlar ve sunucuyu kapatmaz:

DBCC xp_hello(FREE);