Saxlanılan prosedurlar nədir. CREATE PROCEDURE bəndi. Sadə SQL Sazlama

Prosedurlarınıza xətti daxil edin - SET NOCOUNT ON:

Hər bir DML ifadəsi ilə SQL server diqqətlə bizə emal edilmiş qeydlərin sayını ehtiva edən bir mesaj qaytarır. Bu məlumat kodu sazlayarkən bizim üçün faydalı ola bilər, lakin bundan sonra tamamilə faydasız olacaq. SET NOCOUNT ON yazmaqla bu funksiyanı ləğv edirik. Çoxsaylı ifadələr və ya döngələr olan saxlanılan prosedurlar üçün bu hərəkət performansı əhəmiyyətli dərəcədə artıra bilər, çünki trafikin miqdarı əhəmiyyətli dərəcədə azalacaq.

Transact SQL

Sxem adını obyekt adı ilə istifadə edin:

Yaxşı, məncə, aydındır. Bu əməliyyat serverə obyektləri harada axtarmaq lazım olduğunu söyləyir və zibil qutularını təsadüfi qarışdırmaq əvəzinə, hara getməli olduğunu və nə götürəcəyini dərhal biləcək. Çoxlu sayda verilənlər bazası, cədvəllər və saxlanılan prosedurlarla o, vaxtımıza və əsəblərimizə əhəmiyyətli dərəcədə qənaət edə bilər.

Transact SQL

SEÇİN * dbo.MyTable-DƏN -- Bu, yaxşı bir şeydir -- SEÇİN * Əvəzində MyTable-DƏN -- Bu pis bir şeydir -- EXEC proseduruna zəng edin dbo.MyProc -- Yenə yaxşıdır -- EXEC MyProc əvəzinə --Pis!

Saxlanılan prosedur adlarınızda "sp_" prefiksini istifadə etməyin:

Prosedur adımız "sp_" ilə başlayırsa, SQL Serverəvvəlcə onun əsas bazasına baxacaq. Fakt budur ki, bu prefiks serverin şəxsi daxili saxlanılan prosedurları üçün istifadə olunur. Buna görə də, verilənlər bazasında sizinkinizlə eyni adlı prosedur aşkar edilərsə, onun istifadəsi əlavə xərclərə və hətta səhv nəticələrə səbəb ola bilər.

IF EXISTS (SEÇİN *) əvəzinə ƏGƏR MÖVCUDDUR (SEÇİN 1) istifadə edin:

Başqa cədvəldə qeydin olub-olmadığını yoxlamaq üçün IF EXISTS ifadəsindən istifadə edirik. Bu ifadə daxili ifadədən ən azı bir dəyər qaytarıldıqda doğru qaytarır, bunun "1", bütün sütunlar və ya cədvəlin əhəmiyyəti yoxdur. Qaytarılan məlumatlar, prinsipcə, heç bir şəkildə istifadə edilmir. Beləliklə, məlumatların ötürülməsi zamanı trafiki sıxışdırmaq üçün aşağıda göstərildiyi kimi "1"dən istifadə etmək daha məntiqlidir.

Saxlanılan prosedur saxlanılan prosedur) adlı verilənlər bazası proqram obyektidir. SQL Server bir neçə növ saxlanılan prosedurlara malikdir.

Sistemdə saxlanılan prosedurlar sistemdə saxlanılan prosedur) DBMS tərtibatçıları tərəfindən təmin edilir və sistem kataloqunda hərəkətləri yerinə yetirmək və ya sistem məlumatını əldə etmək üçün istifadə olunur. Onların adları adətən "sp_" prefiksi ilə başlayır. Bütün növ saxlanan prosedurlar EXECUTE əmri ilə icra olunur, bu əmr EXEC-ə qədər qısaldıla bilər. Məsələn, heç bir parametr olmadan işləyən sp_helplogins saxlanılan prosedur hesab adları haqqında iki hesabat yaradır. (İngilis dili) girişlər) və hər bir verilənlər bazasında onların müvafiq istifadəçiləri (İngilis dili) istifadəçilər).

EXEC sp_helplogins;

Cədvəldə sistemdə saxlanılan prosedurlardan istifadə etməklə həyata keçirilən hərəkətlər haqqında fikir vermək. 10.6 bəzi nümunələri göstərir. Ümumilikdə, SQL Serverdə mindən çox sistem saxlanılan prosedurlar mövcuddur.

Cədvəl 10.6

SQL Server Sistemində Saxlanılan Prosedurların Nümunələri

İstifadəçi istifadəçi verilənlər bazalarında və müvəqqəti obyektlər üçün verilənlər bazasında saxlanılan prosedurlar yarada bilər. Sonuncu halda, saxlanılan prosedur olacaq müvəqqəti. Müvəqqəti cədvəllərdə olduğu kimi, müvəqqəti saxlanılan prosedurun adı əgər yerli müvəqqəti saxlanılan prosedurdursa, "#" prefiksi ilə, qlobaldırsa, "##" prefiksi ilə başlamalıdır. Yerli müvəqqəti prosedur yalnız yaradıldığı əlaqə daxilində istifadə edilə bilər, qlobal olan digər əlaqələr daxilində də istifadə edilə bilər.

Proqramlaşdırıla bilən SQL Server obyektləri Transact-SQL alətlərindən istifadə etməklə və ya montajlardan istifadə etməklə yaradıla bilər (İngilis dili) assembly) Microsoft.Net Framework-ün CRL (Common Language Runtime) mühitində. Bu dərslikdə yalnız birinci üsul nəzərdən keçiriləcək.

Saxlanılan prosedurları yaratmaq üçün CREATE PROCEDURE ifadəsindən istifadə edin (qısaldılmış PROC olaraq verilə bilər), onun formatı aşağıda verilmişdir:

YARAT (PROC I PROCEDURE) proc_name [ ; sayı]

[(gparameter data_type )

[“standart] |

[İLƏ [ ,...n ] ]

[ TƏKRAR ÜÇÜN ]

AS ([ BEGIN ] sql_statement [;] [ ...n ] [ END ] )

ENCRYPTION seçimi ilə saxlanılan prosedur (və ya trigger, funksiya, görünüş) yaradılarsa, onun kodu mətni oxunmaz hala gətirəcək şəkildə çevrilir. Eyni zamanda, -də qeyd edildiyi kimi, istifadə olunan alqoritm SQL Serverin əvvəlki versiyalarından ötürülür və etibarlı qorunma alqoritmi hesab edilə bilməz - tərs çevrilməni tez bir zamanda həyata keçirməyə imkan verən kommunal proqramlar var.

YENİDƏN KOMPILE seçimi müəyyən edir ki, prosedur hər dəfə çağırılanda sistem mətni yenidən tərtib edəcək. Adi vəziyyətdə, ilk işə salınan prosedur önbellekdə saxlanılır, bu da performansı artırmağa imkan verir.

EXECUTE AS prosedurun icra olunacağı təhlükəsizlik kontekstini müəyyən edir. Sonra, f CALLER | dəyərlərindən biri ÖZÜNÜ | SAHİB | "istifadəçi_adı"). CALLER standart dəyərdir və kodun bu modulu çağıran istifadəçinin təhlükəsizlik kontekstində icra ediləcəyini bildirir. Müvafiq olaraq, istifadəçi yalnız proqramlaşdırıla bilən obyektin özü üçün deyil, həm də onun təsirinə məruz qalan digər verilənlər bazası obyektləri üçün icazələrə sahib olmalıdır. ÖZÜNÜZ KİMİ İDARƏ EDİN istifadəçinin proqramlaşdırıla bilən obyekti yaradan və ya dəyişdirən kontekstindən istifadə etmək deməkdir. OWNER kodun prosedurun cari sahibinin kontekstində icra ediləcəyini müəyyən edir. Əgər onun üçün heç bir sahib müəyyən edilməyibsə, onda onun aid olduğu sxemin sahibi qəbul edilir. "istifadəçi_adı" KİMİ İDARƏ EDİN istifadəçi adını açıq şəkildə göstərməyə imkan verir (tək dırnaqlarda).

Parametrlər prosedur üçün müəyyən edilə bilər. Bunlar dəyərləri prosedura ötürmək üçün istifadə edilən yerli dəyişənlərdir. Əgər parametr OUTPUT (və ya qısaca OUT) açar sözü ilə elan edilirsə, o, çıxışdır: prosedurda ona verilən qiymət, bitdikdən sonra proseduru çağıran proqram tərəfindən istifadə edilə bilər. READONLY açar sözü o deməkdir ki, saxlanılan prosedur daxilində parametrin qiyməti dəyişdirilə bilməz.

Parametrlərə standart qiymətlər təyin oluna bilər, prosedura çağırarkən parametrin dəyəri açıq şəkildə göstərilmədikdə istifadə olunacaq. Məsələni nəzərdən keçirək:

PROC surma YARADIN (@a int, @b int=0,

©nəticə int OUTPUT) AS

SET @nəticə=0a+0b

Biz üç parametrli prosedur yaratdıq, burada @b parametrinin standart dəyəri 0, @result parametri isə çıxış parametridir: onun vasitəsilə dəyər çağıran proqrama qaytarılır. İcra edilən hərəkətlər olduqca sadədir - çıxış parametri iki girişin cəminin dəyərini alır.

SQL Server Management Studio-da işləyərkən yaradılmış saxlanan proseduru proqramlaşdırıla bilən verilənlər bazası obyektləri bölməsində tapmaq olar (İngilis dili) Proqramlaşdırıla bilən) saxlanılan prosedurlar bölməsində (Şəkil 10.2).

Proseduru çağırarkən həm dəyişənlər, həm də sabitlər giriş parametrləri kimi istifadə edilə bilər. Gəlin iki misalı nəzərdən keçirək. Birincidə, prosedurun giriş parametrləri açıq şəkildə sabitlər tərəfindən təyin olunur, çağırışda çıxış parametri üçün OUTPUT açar sözü təyin olunur. İkinci variantda dəyişənin dəyəri birinci giriş parametri kimi, ikinci parametr üçün isə istifadə olunur. açar söz DEFAULT, standart dəyərin istifadə edilməli olduğunu göstərir:

düyü. 10.2.

DECLARE @with int;

EXEC cəmi 10,5,@c ÇIXIŞ;

PRINT0c; - 15 göstəriləcək

ELAN EDİN Gi int = 5;

- zəng edərkən standart dəyərdən istifadə edin

EXEC yekunu Gi,DEFAULT , 0s ÇIXIŞI;

PRINT0c; - 5 göstərilir

İndi prosedurun bitdiyi qaytarma kodunun təhlili ilə bir nümunə nəzərdən keçirin. Bookl cədvəlindəki neçə kitabın müəyyən illər ərzində nəşr olunduğunu hesablamaq lazım gəlsin. Bu halda, başlanğıc ili son ildən böyükdürsə, prosedur "1" qaytarır və sayılmır, əks halda biz kitabların sayını hesablayırıq və 0 qaytarırıq:

PROC CREATE dbo.rownum(0Birinci İl int, GLastYear int, 0result int OUTPUT) AS

ƏGƏR 0Birinciİl>0Keçənİl DÖNÜŞ 1

SET @result= (dbo.Bookl FROM COUNT(*) SEÇİN

0Birinci İllə 0Keçənİl ARASINDA) ;

Qaytarma kodunun tam dəyişən 0ret-də saxlandığı bu proseduru çağırmaq variantını nəzərdən keçirək, bundan sonra onun dəyəri təhlil edilir (bu halda 1 olacaq). operatorda istifadə olunur PRINT funksiyası CAST tam Gres dəyişəninin dəyərini sətir tipinə çevirmək üçün istifadə olunur:

ELAN 0ret int, Gres int

EXEC Gret = rownum 2004, 2002, Gres OUT;

IF 0ret=l PRINT "Başlanğıc il son ildən böyükdür"

ÇAP "Kitabların sayı"+ CAST(Gres varchar(20))

Saxlanılan prosedurlar yalnız cədvəldəki məlumatları oxuya bilməz, həm də məlumatları dəyişdirə və hətta cədvəllər və bir sıra digər verilənlər bazası obyektləri yarada bilər.

Bununla belə, saxlanılan prosedurdan sxemlər, funksiyalar, tetikler, prosedurlar və görünüşlər yaradıla bilməz.

Aşağıdakı misal həm bu imkanları, həm də müvəqqəti obyektlərin əhatə dairəsi ilə bağlı məsələləri göstərir. Aşağıdakı saxlanılan prosedur #Tab2 müvəqqəti cədvəlinin mövcudluğunu yoxlayır; bu cədvəl mövcud deyilsə, onu yaradır. Bundan sonra, iki sütunun dəyərləri #Tab2 cədvəlinə daxil edilir və cədvəlin məzmunu SELECT ifadəsi ilə göstərilir:

PROC YARADIN My_Procl (@id int, @name varchar(30))

ƏGƏR OBJECT_ID("tempdb.dbo.#Tab21) NULL Olsa

INSERT INTO dbo.#Tab2 (id, name)VALUES (0id,0name)

dbo-dan * SEÇİN. #Tab2 -#1

Saxlanılan prosedura ilk çağırışdan əvvəl, burada istifadə edilən #Tab2 müvəqqəti cədvəlini yaradaq. EXEC operatoruna diqqət yetirin. Əvvəlki nümunələrdə parametrlər "mövqe ilə" proseduruna ötürülürdü, lakin bu halda parametrlərin ötürülməsi üçün fərqli bir format istifadə olunur - "adı ilə", parametrin adı və dəyəri açıq şəkildə göstərilir:

CREATE TABLE dbo.#Tab2 (id int, ad varchar(30));

EXEC My_Procl 0name="lvan", 0id=2;

SEÇİN * FROM dbo.#Tab2; -#2

Yuxarıdakı misalda SELECT ifadəsi iki dəfə yerinə yetiriləcək: birinci dəfə - prosedur daxilində, ikinci dəfə - çağıran kod fraqmentindən ("No. 2" şərhi ilə qeyd olunur).

İkinci prosedur çağırışından əvvəl #Tab2 müvəqqəti cədvəlini silək. Sonra saxlanılan prosedurdan eyni adlı müvəqqəti cədvəl yaradılacaq:

CƏDVƏL ATIYIN dbo.#Tab2;

EXEC My_Procl 0name="İvan", 0id=2;

SEÇİN * FROM dbo.#Tab2; -#2

Bu halda, yalnız prosedur daxilindəki SELECT ifadəsi ("Xa 1" şərhi ilə) məlumatları göstərəcəkdir. SELECT "#2"-nin icrası xəta ilə nəticələnəcək, çünki saxlanılan prosedurda yaradılmış müvəqqəti cədvəl prosedur qaytarıldıqda tempdb verilənlər bazasından artıq silinəcək.

Siz DROP PROCEDURE ifadəsindən istifadə edərək saxlanılan proseduru ləğv edə bilərsiniz. Onun formatı aşağıda göstərilmişdir. Bir ifadə ilə bir neçə saxlanılan proseduru vergüllə ayıraraq silə bilərsiniz:

DROP (PROC I PROSEDURE) ( prosedur ) [

Məsələn, əvvəllər yaradılmış summa prosedurunu çıxaraq:

DROP PROC xülasəsi;

Siz ALTER PROCEDURE bəyanatından istifadə edərək mövcud prosedura dəyişikliklər edə bilərsiniz (əslində onu ləğv edin)

Qısaltma PROC). ALTER açar sözü istisna olmaqla, ifadənin formatı CREATE PROCEDURE ilə demək olar ki, eynidir. Məsələn, dbo prosedurunu dəyişək. rownum sahibinin təhlükəsizlik kontekstində yerinə yetirilməsini təyin edərək:

ALTER PROC dbo.rownum(SFirsYear int,

SLastYear int, Sresult int OUTPUT)

SAHİB KİMİ İDARƏ EDİLMƏK İLƏ - seçimi təyin edin

ƏGƏR 0Birinciİl>0Keçənİl DÖNÜŞ 1 YAXŞI BAŞLASIN

SET 0result= (dbo.Bookl-DAN COUNT(*) SEÇİN

SFirsYear və SastYear ARASINDA);

Bəzi hallarda, dinamik olaraq əmr yaratmaq və verilənlər bazası serverində icra etmək lazım ola bilər. Bu vəzifə EXEC operatorundan istifadə etməklə də həll edilə bilər. Aşağıdakı nümunə İl atributunun dəyişən tərəfindən göstərilən dəyərə bərabər olması şərtinə əsasən Bookl cədvəlindən qeydləri seçir:

DECLARE 0y int = 2000;

EXEC("SEÇ * FROM dbo.Bookl WHERE = " [email protected]) ;

Dinamik olaraq yaradılan təlimatların icrası "SQL injection" kimi kompüter hücumlarının həyata keçirilməsi üçün ilkin şərtlər yaradır. (İngilis dili) SQL inyeksiyası). Hücumun mahiyyəti ondan ibarətdir ki, cinayətkar öz SQL kodunu dinamik şəkildə yaradılan sorğuya yeritsin. Bu, adətən istifadəçi daxiletmə nəticələrindən daxili parametrlər götürüldükdə baş verir.

Əvvəlki nümunəni bir az dəyişdirək:

DECLARE 0y varchar(100);

SET 0y="2OOO"; - istifadəçidən aldığımız budur

SET ifadəsində təyin edilmiş sətir dəyərini istifadəçidən aldığımızı fərz etsək (necə olursa olsun, məsələn, veb proqram vasitəsilə), onda nümunə kodumuzun "müntəzəm" davranışını göstərir.

DECLARE 0y varchar(100);

SET 0y="2000; dbo.Book2-DƏN SİL"; - inyeksiya

EXEC("SEÇ * FROM dbo.Book2 WHERE="+0y);

SQL inyeksiyasına maneələrdən biri olan parametrlərin tipinə nəzarət etməyə imkan verən belə hallarda mümkün olduqca sp_executcsql sistemində saxlanılan prosedurdan istifadə etmək tövsiyə olunur. Onun formatını təfərrüatlı nəzərdən keçirmədən, əvvəllər təqdim olunana bənzər bir nümunəni təhlil edəcəyik:

EXECUTE sp_executesql

N"SEÇ * FROM dbo.Bookl WHERE =0y",

Bu, sorğuda istifadə olunan parametrin növünü açıq şəkildə müəyyən edir və SQL Server icra zamanı ona nəzarət edəcək. Dırnaq işarələrinin qarşısındakı "N" hərfi prosedurun tələb etdiyi kimi, bunun Unicode hərfi sabiti olduğunu göstərir. Parametrə təkcə sabit qiymət deyil, həm də başqa dəyişənin qiyməti təyin edilə bilər.

1. Prosedurlarınıza sətri daxil edin - SET NOCOUNT ON: Hər bir DML ifadəsi ilə SQL server diqqətlə bizə emal edilmiş qeydlərin sayını ehtiva edən bir mesaj qaytarır. Kodu sazlayarkən bu məlumat bizim üçün faydalı ola bilər, lakin bundan sonra tamamilə faydasız olacaq. SET NOCOUNT ON yazmaqla bu funksiyanı ləğv edirik. Çoxsaylı ifadələr və ya döngələr olan saxlanılan prosedurlar üçün bu hərəkət performansı əhəmiyyətli dərəcədə artıra bilər, çünki trafikin miqdarı əhəmiyyətli dərəcədə azalacaq.

PROC dbo.ProcName YARADIN
AS
NO COUNT ON SET;
--Prosedur kodu burada
dbo.TblCədvəl1-DƏN sütun1 SEÇİN
--SET NOCOUNT-u ilkin vəziyyətə keçirin
SAYI SÖNDÜRMƏNİ SET;
GO

2. Obyekt adı ilə sxem adından istifadə edin: Yaxşı, məncə, aydındır. Bu əməliyyat serverə obyektləri harada axtarmaq lazım olduğunu söyləyir və zibil qutularını təsadüfi qarışdırmaq əvəzinə, hara getməli olduğunu və nə götürəcəyini dərhal biləcək. Çoxlu sayda verilənlər bazası, cədvəllər və saxlanılan prosedurlarla o, vaxtımıza və əsəblərimizə əhəmiyyətli dərəcədə qənaət edə bilər.

dbo.MyTable FROM * SEÇİN --Bunu etmək üçün yaxşı bir yoldur
-- Əvəzinə
Cədvəldən * SEÇİN - Bu pis bir işdir
--Prosedur çağırışı
EXEC dbo.MyProc -- Yenə yaxşıdır
--Əvəzinə
EXEC MyProc - Pis!

3. Saxlanılan prosedurlarınızın adında "sp_" prefiksini istifadə etməyin: Prosedur adımız "sp_" ilə başlayırsa, SQL Server əvvəlcə öz əsas verilənlər bazasına baxacaq. Fakt budur ki, bu prefiks serverin şəxsi daxili saxlanılan prosedurları üçün istifadə olunur. Buna görə də, verilənlər bazasında sizinkinizlə eyni adlı prosedur aşkar edilərsə, onun istifadəsi əlavə xərclərə və hətta səhv nəticələrə səbəb ola bilər.

4. IF EXISTS (SEÇİN *) əvəzinə IF EXISTS (SEÇİN 1) istifadə edin: Başqa cədvəldə qeydin olub-olmadığını yoxlamaq üçün IF EXISTS ifadəsindən istifadə edirik. Daxili ifadədən ən azı bir dəyər qaytarıldıqda bu ifadə doğru qaytarır, bunun "1", bütün sütunlar və ya cədvəlin əhəmiyyəti yoxdur. Qaytarılan məlumatlar, prinsipcə, heç bir şəkildə istifadə edilmir. Beləliklə, məlumat ötürülməsi zamanı trafiki sıxışdırmaq üçün aşağıda göstərildiyi kimi "1"dən istifadə etmək daha məntiqlidir:

ƏGƏR VARSA (Sysobjects.FROM 1 SEÇİN
WHERE adı = "Mənim Cədvəlim" VƏ növü = "U")

5. Səhvləri tutmaq üçün TRY-Catch istifadə edin: 2005-ci serverdən əvvəl, hər sorğudan sonra prosedurda çoxlu sayda səhv yoxlaması yazılırdı. Daha çox kod həmişə daha çox resurs və daha çox vaxt sərf edir. 2005-ci ildən etibarən SQL Server daha düzgün və daha düzgün görünür rahat yol bu problemin həlli yolları:

Cəhd edin
--kod
SINAYI SON EDİN
Tutmağa BAŞLAYIN
-- səhv tutma kodu
SON TUTMA

Nəticə
Əsasən, bu gün üçün əlimdə olan şey budur. Bir daha təkrar edirəm ki, burada yalnız öz təcrübəmdə istifadə etdiyim üsullar var və mən onların effektivliyinə zəmanət verə bilərəm.

P.S.
İlk yazım, qəti mühakimə etməyin.

Saxlanılan prosedur SQL dili və prosedur uzantılarından istifadə etməklə yaradılmış Transact-SQL bəyanat toplusunun xüsusi növüdür. Paketin saxlanılan prosedurdan əsas fərqi ondan ibarətdir ki, sonuncu verilənlər bazası obyekti kimi saxlanılır. Başqa sözlə, təkrarlanan tapşırıqların performansını və ardıcıllığını yaxşılaşdırmaq üçün saxlanılan prosedurlar server tərəfində saxlanılır.

Database Engine saxlanılan prosedurları və sistem prosedurlarını dəstəkləyir. Saxlanılan prosedurlar bütün digər verilənlər bazası obyektləri ilə eyni şəkildə yaradılır, yəni. DDL dilindən istifadə etməklə. Sistem Prosedurları Verilənlər Bazası Mühərriki tərəfindən təmin edilir və sistem kataloqunda məlumat əldə etmək və dəyişdirmək üçün istifadə edilə bilər.

Saxlanılan prosedur yaratarkən, parametrlərin əlavə siyahısını müəyyən edə bilərsiniz. Beləliklə, prosedur hər dəfə çağırılanda müvafiq arqumentləri qəbul edəcəkdir. Saxlanılan prosedurlar istifadəçi tərəfindən müəyyən edilmiş məlumatı ehtiva edən dəyəri və ya xəta baş verdikdə müvafiq xəta mesajını qaytara bilər.

Saxlanılan prosedur verilənlər bazasında obyekt kimi saxlanmazdan əvvəl əvvəlcədən tərtib edilir. Prosedurun əvvəlcədən tərtib edilmiş forması verilənlər bazasında saxlanılır və hər dəfə çağırılanda istifadə olunur. Saxlanılan prosedurların bu xüsusiyyəti (demək olar ki, bütün hallarda) prosedurların təkrar kompilyasiyasını aradan qaldırmağın və müvafiq performans yaxşılaşdırılmasının əldə edilməsinin vacib faydasını təmin edir. Saxlanılan prosedurların bu xassəsi verilənlər bazası sistemi ilə proqramlar arasında mübadilə edilən məlumatların həcminə də müsbət təsir göstərir. Xüsusilə, bir neçə min baytlıq saxlanılan prosedura zəng 50 baytdan az tələb edə bilər. Bir neçə istifadəçi saxlanılan prosedurlardan istifadə edərək təkrarlanan tapşırıqları yerinə yetirdikdə, bu qənaətlərin məcmu təsiri əhəmiyyətli ola bilər.

Saxlanan prosedurlar həmçinin aşağıdakı məqsədlər üçün istifadə edilə bilər:

    verilənlər bazası cədvəlləri ilə hərəkətlər haqqında qeydlər jurnalını yaratmaq.

Saxlanılan prosedurların istifadəsi istifadəçilərə müxtəlif giriş imtiyazları verən GRANT və REVOKE bəyanatlarının istifadəsi ilə verilən təhlükəsizlikdən xeyli kənara çıxan təhlükəsizlik nəzarəti səviyyəsini təmin edir. Bu, mümkün ola bilər, çünki saxlanılan proseduru icra etmək icazəsi, növbəti bölmədə təsvir olunduğu kimi, saxlanılan prosedurun tərkibində olan obyektləri dəyişdirmək səlahiyyətindən asılı deyildir.

Cədvəl yazma və/yaxud oxu əməliyyatlarının jurnallarını yaradan saxlanılan prosedurlar təmin edir əlavə imkan verilənlər bazası təhlükəsizliyi. Bu cür prosedurlardan istifadə edərək verilənlər bazası inzibatçısı istifadəçilər və ya proqramlar tərəfindən verilənlər bazasına edilən dəyişiklikləri izləyə bilər.

Saxlanılan Prosedurların Yaradılması və İcrası

Saxlanan prosedurlar ifadədən istifadə etməklə yaradılır PROSEDUR YARATIN, aşağıdakı sintaksisə malikdir:

PROC proc_name YARATIN [((@param1) type1 [ DƏYİŞƏN] [= default1] )] (, …) toplu olaraq | EXTERNAL NAME metod_adı Sintaksis konvensiyaları

schema_name parametri yaradılan saxlanılan prosedurun sahibi tərəfindən təyin edilən sxem adını müəyyən edir. proc_name parametri saxlanılan prosedurun adını təyin edir. @param1 parametri məlumat növü type1 parametri ilə müəyyən edilən prosedur parametridir (formal arqument). Lokal dəyişənlər paket daxilində lokal olduğu kimi prosedur parametrləri prosedur daxilində lokaldır. Prosedur parametrləri zəng edən tərəfindən istifadə üçün prosedura ötürülən dəyərlərdir. default1 parametri müvafiq prosedur parametri üçün standart dəyəri təyin edir. (Defolt dəyər də NULL ola bilər.)

ÇIXIŞ seçimi prosedur parametrinin qaytarıla biləcəyini və saxlanılan prosedurdan çağıran prosedura və ya sistemə dəyəri qaytarmaq üçün istifadə edilə biləcəyini müəyyən edir.

Daha əvvəl qeyd edildiyi kimi, prosedurun əvvəlcədən tərtib edilmiş forması verilənlər bazasında saxlanılır və hər dəfə çağırılanda istifadə olunur. Əgər nədənsə saxlanılan proseduru hər dəfə çağırılanda tərtib etmək lazımdırsa, prosedurun elanında istifadə olunur. RECOMPILE İLƏ seçim. YENİDƏN TƏRKİB İLƏ seçimindən istifadə saxlanılan prosedurların ən mühüm üstünlüklərindən birini rədd edir: tək kompilyasiya sayəsində performans yaxşılaşması. Buna görə də, WITH RECOMPILE seçimi yalnız saxlanılan prosedur tərəfindən istifadə olunan verilənlər bazası obyektlərində tez-tez dəyişikliklər olduqda istifadə edilməlidir.

Təklif KİMİ İCRA EDİN saxlanılan prosedur çağırıldıqdan sonra icra edilməli olduğu təhlükəsizlik kontekstini müəyyən edir. Bu konteksti təyin etməklə Database Engine bu saxlanılan prosedurun istinad etdiyi obyektlərə giriş icazələrini yoxlamaq üçün istifadəçi hesablarının seçiminə nəzarət edə bilər.

Varsayılan olaraq, yalnız sysadmin sabit server rolunun üzvləri və db_owner və ya db_ddladmin sabit verilənlər bazası rolu CREATE PROCEDURE bəyanatından istifadə edə bilər. Bununla belə, bu rolların üzvləri təlimatdan istifadə edərək bu hüququ digər istifadəçilərə təyin edə bilərlər QRANT YARATMA PROSEDURU.

Aşağıdakı nümunə Layihə cədvəli ilə işləmək üçün sadə saxlanılan prosedurun necə yaradılacağını göstərir:

Nümunə Db-dən istifadə edin; GEDİN PROSEDUR YARATIN ArtırınBüdcə (@faiz INT=5) YENİLƏNİB Layihə Dəsti Büdcə = Büdcə + Büdcə * @faiz/100;

Daha əvvəl qeyd edildiyi kimi, iki paketi ayırmaq üçün istifadə olunur GO təlimatı. CREATE PROCEDURE ifadəsi eyni topludakı digər Transact-SQL ifadələri ilə birləşdirilə bilməz. IncreaseBudget saxlanan proseduru bütün layihələr üçün büdcələri @faiz parametri ilə müəyyən edilmiş müəyyən faiz artırır. Prosedur həmçinin prosedurun icrası zamanı bu arqument mövcud olmadıqda tətbiq edilən standart faiz dəyərini (5) müəyyən edir.

Saxlanılan prosedurlar mövcud olmayan cədvəllərə daxil ola bilər. Bu xüsusiyyət əvvəlcə müvafiq cədvəllər yaratmadan və hətta təyinat serverinə qoşulmadan prosedur kodunu sazlamağa imkan verir.

Həmişə cari verilənlər bazasında saxlanılan əsas saxlanılan prosedurlardan fərqli olaraq, tempdb müvəqqəti sistem verilənlər bazasında həmişə yerləşdirilən müvəqqəti saxlanılan prosedurlar yaratmaq mümkündür. Müvəqqəti saxlanılan prosedurların yaradılmasının səbəblərindən biri verilənlər bazasına qoşulduqda müəyyən qrup ifadələrin təkrar icrasının qarşısını almaq ola bilər. Siz yerli və ya qlobal müvəqqəti prosedurlar yarada bilərsiniz. Bunun üçün lokal prosedurun adı tək # simvolu (#proc_name), qlobal prosedurun adı isə qoşa simvol (##proc_name) ilə müəyyən edilir.

Yerli müvəqqəti saxlanılan prosedur yalnız onu yaradan istifadəçi tərəfindən və yalnız onun yaradıldığı verilənlər bazasına qoşulma zamanı yerinə yetirilə bilər. Qlobal müvəqqəti prosedur bütün istifadəçilər tərəfindən yerinə yetirilə bilər, lakin yalnız onun işlədiyi son əlaqə (adətən prosedurun yaradıcısının əlaqəsi) dayandırılana qədər.

Saxlanılan prosedurun həyat dövrü iki mərhələdən ibarətdir: onun yaradılması və icrası. Hər bir prosedur bir dəfə yaradılır və dəfələrlə yerinə yetirilir. Saxlanılan prosedur tərəfindən yerinə yetirilir İfadələri icra edin prosedura sahib olan və ya prosedura daxil olmaq üçün EXECUTE hüququna malik olan istifadəçi. EXECUTE ifadəsi aşağıdakı sintaksisə malikdir:

[] [@return_status =] (proc_name | @proc_name_var) ([[@parameter1 =] dəyər | [@parameter1=] @dəyişən ] | DEFAULT).. Sintaksis konvensiyaları

return_status parametri istisna olmaqla, EXECUTE ifadəsinin bütün parametrləri eyni adlı CREATE PROCEDURE ifadəsinin parametrləri ilə eyni məntiqi qiymətə malikdir. return_status parametri prosedurun qaytarılması statusunu saxlayan tam dəyişəni müəyyən edir. Dəyər ya sabit (dəyər) və ya yerli dəyişən (@dəyişən) istifadə edərək parametrə təyin edilə bilər. Adlandırılmış parametr dəyərlərinin sırası vacib deyil, lakin adsız parametr dəyərləri CREATE PROCEDURE bəyanatında müəyyən edildiyi ardıcıllıqla verilməlidir.

DEFAULT bəndi prosedur tərifində göstərilən prosedur parametri üçün standart dəyərləri təmin edir. Prosedura heç bir defolt dəyərinin müəyyən edilmədiyi və parametrin çatışmadığı və ya DEFAULT açar sözünün göstərildiyi parametr üçün dəyər gözlədikdə xəta baş verir.

EXECUTE ifadəsi topluda ilk ifadə olduqda, EXECUTE açar sözü buraxıla bilər. Ancaq bu sözü hər paketə daxil etmək daha təhlükəsizdir. EXECUTE ifadəsinin istifadəsi aşağıdakı nümunədə göstərilmişdir:

Nümunə Db-dən istifadə edin; IncreaseBudget 10-u İCRA EDİN;

Bu nümunədəki EXECUTE ifadəsi bütün layihələrin büdcəsini 10% artıran IncreaseBudget saxlanan prosedurunu yerinə yetirir.

Aşağıdakı nümunə İşçi və İş_on cədvəllərində verilənləri emal etmək üçün saxlanılan prosedurun necə yaradılacağını göstərir:

Nümunədə ModifyEmpId proseduru saxlanılan prosedurların istinad bütövlüyü prosesinin bir hissəsi kimi istifadəsini təsvir edir (bu halda İşçi və İş_on cədvəlləri arasında). Bu cür saxlanılan prosedur, faktiki olaraq istinad bütövlüyünü təmin edən tətik tərifi daxilində istifadə edilə bilər.

Aşağıdakı nümunə saxlanılan prosedurda OUTPUT bəndinin istifadəsini göstərir:

Bu saxlanılan prosedur aşağıdakı ifadələrdən istifadə etməklə yerinə yetirilə bilər:

DECLARE @quantityDeleteEmployee INT; İCRA EDİN DeleteEmployee @empId=18316, @ [email protected]ÇIXIŞ; PRINT N"İşçilər silindi: " + convert(nvarchar(30), @quantityDeleteEmployee);

Bu prosedur @empId personal nömrəsi olan işçinin üzərində işlədiyi layihələrin sayını hesablayır və nəticədə alınan dəyəri ©counter parametrinə təyin edir. İşçi və İş_on cədvəllərindən verilmiş kadr nömrəsi üçün bütün sətirlər silindikdən sonra hesablanmış dəyər @quantityDeleteEmployee dəyişəninə təyin edilir.

Parametr dəyəri çağırış proseduruna yalnız OUTPUT seçimi təyin edildikdə qaytarılır. Yuxarıdakı nümunədə DeleteEmployee proseduru @counter parametrini çağırış proseduruna ötürür, beləliklə, saxlanılan prosedur dəyəri sistemə qaytarır. Buna görə də @counter parametri həm prosedur elan edilərkən OUTPUT variantında, həm də onu çağırarkən EXECUTE operatorunda göstərilməlidir.

İLƏ NƏTİCƏLƏR SETS EXECUTE ifadəsinin bəndi

SQL Server 2012-də EXECUTE ifadəsi yazılır İLƏ NƏTİCƏLƏR SETS bəndi Müəyyən şərtlər altında saxlanılan prosedurun nəticə dəstinin formasını dəyişə bilən.

Aşağıdakı iki nümunə bu cümləni izah etməyə kömək edəcək. Birinci nümunə WITH RESULTS SETS bəndi buraxıldıqda nəticənin necə görünə biləcəyini göstərən giriş nümunəsidir:

EmployeesInDept proseduru müəyyən bir şöbədə çalışan bütün işçilərin şəxsi nömrələrini və soyadlarını göstərən sadə prosedurdur. Şöbə nömrəsi prosedur parametridir və proseduru çağırarkən qeyd edilməlidir. Bu prosedurun yerinə yetirilməsi, başlıqları verilənlər bazası cədvəlindəki müvafiq sütunların adlarına uyğun gələn iki sütunlu bir cədvəl verir, yəni. id və soyad. Nəticə sütununun başlıqlarını (həmçinin onların məlumat növlərini) dəyişdirmək üçün SQL Server 2012 yeni İLƏ NƏTİCƏLƏR DƏSTƏLƏRİ bəndindən istifadə edir. Bu bəndin tətbiqi aşağıdakı nümunədə göstərilmişdir:

Nümunə Db-dən istifadə edin; EXEC EmployeesInDept "d1" NƏTİCƏ DƏSTƏLƏRİ (( INT NOT NULL, [Soyad] CHAR(20) NOT NULL));

Bu şəkildə çağırılan saxlanılan prosedurun icrasının nəticəsi aşağıdakı kimi olacaq:

Göründüyü kimi, EXECUTE bəyanatında WITH RESULT SETS bəndindən istifadə edərək saxlanılan prosedurun icrası prosedurun yaratdığı nəticə dəsti sütunlarının adlarını və məlumat tipini dəyişməyə imkan verir. Beləliklə, bu yeni funksionallıq saxlanılan prosedurların icrasında və onların nəticələrinin yeni cədvəldə yerləşdirilməsində daha çox çeviklik təmin edir.

Saxlanılan Prosedurların strukturunun dəyişdirilməsi

Verilənlər Bazası Mühərriki də bəyanatı dəstəkləyir PROSEDURU DƏYİŞTİRİN saxlanılan prosedurların strukturunu dəyişdirmək. ALTER bəyanatı PROCEDURE adətən prosedur daxilində Transact-SQL ifadələrini dəyişdirmək üçün istifadə olunur. ALTER PROCEDURE ifadəsinin bütün parametrləri CREATE PROCEDURE ifadəsinin eyni adlı parametrləri ilə eyni məna daşıyır. Bu ifadədən istifadənin əsas məqsədi mövcud saxlanılan prosedur icazələrini ləğv etməməkdir.

Database Engine dəstəkləyir CURSOR məlumat növü. Bu məlumat növü saxlanılan prosedurlarda kursorları elan etmək üçün istifadə olunur. Kursor sorğunun nəticələrini (adətən sıralar toplusu) saxlamaq və istifadəçilərə həmin nəticəni sətir-sətir göstərməyə imkan vermək üçün istifadə edilən proqramlaşdırma konstruksiyasıdır.

Bir və ya bir qrup saxlanılan prosedurları silmək üçün istifadə edin DROP PROCEDURE bəyanatı. Yalnız saxlanılan prosedur sahibi və ya db_owner və sysadmin sabit rollarının üzvləri saxlanılan proseduru silə bilər.

Saxlanan prosedurlar və ümumi dil işləmə vaxtı

SQL Server C# və istifadə edərək müxtəlif verilənlər bazası obyektlərini (saxlanan prosedurlar, istifadəçi tərəfindən müəyyən edilmiş funksiyalar, tetikleyiciler, istifadəçi tərəfindən müəyyən edilmiş aqreqatlar və istifadəçi tərəfindən müəyyən edilmiş məlumat növləri) inkişaf etdirməyə imkan verən Ümumi Dil İcra Zamanını (CLR) dəstəkləyir. Visual Basic. Ümumi dil işləmə vaxtı bu obyektlərin ümumi iş vaxtı sistemindən istifadə edərək icra edilməsinə də imkan verir.

Ümumi dil işləmə müddəti seçim vasitəsilə aktiv və deaktiv edilir clr_enabled sistem proseduru sp_konfiqurasiya, göstərişi ilə icrası üçün işə salınır YENİDƏN KONfiqurasiya edin. Aşağıdakı nümunə sp_configure sistem prosedurundan istifadə edərək ümumi dil işləmə vaxtını necə aktivləşdirə biləcəyinizi göstərir:

Nümunə Db-dən istifadə edin; EXEC sp_configure "clr_enabled",1 YENİDAN KONFIGURE

CLR-dən istifadə edərək prosedur yaratmaq, tərtib etmək və saxlamaq üçün sadalanan ardıcıllıqla aşağıdakı addımlar ardıcıllığı tələb olunur:

    C# və ya Visual Basic-də saxlanılan prosedur yaradın və sonra müvafiq kompilyatordan istifadə edərək tərtib edin.

    Təlimatdan istifadə YAXŞILIQ YARATIN, müvafiq icraedici faylı yaradın.

    EXECUTE ifadəsindən istifadə edərək proseduru yerinə yetirin.

Aşağıdakı rəqəm göstərir qrafik sxeməvvəllər qeyd olunan addımlar. Aşağıdakılar daha çoxdur Ətraflı Təsviri bu proses.

Əvvəlcə, məsələn, bəzi inkişaf mühitində tələb olunan proqramı yaradın vizual studiya. C# və ya Visual Basic kompilyatorundan istifadə edərək hazır proqramı obyekt koduna tərtib edin. Bu kod, aralıq icra edilə bilən kodu yaradan CREATE ASSEMBLY bəyanatı üçün mənbə kimi xidmət edən dinamik keçid kitabxanasında (.dll) saxlanılır. Daha sonra icra olunan kodu verilənlər bazası obyekti kimi saxlamaq üçün CREATE PROCEDURE bəyanatını verin. Nəhayət, tanış EXECUTE ifadəsindən istifadə edərək proseduru yerinə yetirin.

Aşağıdakı nümunə C#-da saxlanılan prosedurun mənbə kodunu göstərir:

System.Data.SqlClient-dən istifadə; Microsoft.SqlServer.Server istifadə edərək; ictimai qismən sinif StoredProcedures ( ictimai statik int CountEmployees() ( int sətirlər; SqlConnection bağlantısı = yeni SqlConnection("Kontekst Bağlantısı=true"); connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = "seçmək count(*) kimi "İşçilərin sayı" " + "İşçidən"; sətirlər = (int)cmd.ExecuteScalar(); connection.Close(); sətirləri qaytarın; ) )

Bu prosedur İşçi cədvəlindəki sətirlərin sayını hesablamaq üçün sorğu həyata keçirir. Proqramın əvvəlində direktivlərdən istifadə edərək, onun icrası üçün tələb olunan ad boşluqlarını təyin edin. Bu direktivlərin istifadəsi sizə müvafiq ad boşluqlarını açıq şəkildə göstərmədən mənbə kodunda sinif adlarını təyin etməyə imkan verir. Sonra StoredProcedures sinfi müəyyən edilir, bunun üçün SqlProcedure atributu, kompilyatora bu sinfin saxlanılan prosedur olduğunu bildirir. Sinif kodunun daxilində CountEmployees() metodu müəyyən edilmişdir. Verilənlər bazası sistemi ilə əlaqə sinfin bir nümunəsi vasitəsilə qurulur SqlConnection. Əlaqəni açmaq üçün bu nümunənin Open() metodundan istifadə olunur. A CreateCommand() metodu bir sinfin nümunəsinə daxil olmağa imkan verir SqlCommnd, istədiyiniz SQL əmrinin ötürüldüyü.

Aşağıdakı kod parçasında:

Cmd.CommandText = "İşçidən " + ""İşçilərin sayı" kimi count(*) seçin";

İşçi cədvəlində sətirlərin sayını hesablamaq və nəticəni göstərmək üçün SELECT ifadəsindən istifadə edir. Komanda mətni cmd dəyişəninin CommandText xassəsini CreateCommand() metodu ilə qaytarılan nümunəyə təyin etməklə müəyyən edilir. Sonrakı adlanır ExecuteScalar() metodu SqlCommand nümunəsi. Bu üsul int tam məlumat növünə çevrilən və sətir dəyişəninə təyin edilən skalyar dəyəri qaytarır.

İndi bu kodu Visual Studio istifadə edərək tərtib edə bilərsiniz. Mən bu sinfi CLRStoredProcedures adı ilə layihəyə əlavə etdim, ona görə də Visual Studio eyniadlı montajı *.dll uzantısı ilə tərtib edəcək. Aşağıdakı nümunə saxlanılan prosedurun yaradılmasında növbəti addımı göstərir: işləmək üçün kodun yaradılması. Bu nümunədəki kodu icra etməzdən əvvəl siz tərtib edilmiş .dll faylının yerini bilməlisiniz (adətən layihənin Debug qovluğunda yerləşir).

Nümunə Db-dən istifadə edin; "D:\Projects\CLRStoredProcedures\bin\Debug\CLRStoredProcedures.dll"DƏN PERMISSION_SET = TƏHLÜKƏSİZLİK İLƏ CLRStoredProcedures YARATIN

CREATE ASSEMBLY bəyanatı idarə olunan kodu giriş kimi qəbul edir və ümumi dil işləmə vaxtı (CLR) saxlanan prosedurları, istifadəçi tərəfindən müəyyən edilmiş funksiyaları və tetikleyicileri yarada biləcəyiniz uyğun obyekt yaradır. Bu təlimat aşağıdakı sintaksisə malikdir:

YARAT ASSEMBLY assembly_name [ AUTORIZATION sahibi_name ] FROM (dll_fayl) Sintaksis konvensiyaları

assembly_name parametri montajın adını təyin edir. Könüllü AVTORIZASYON bəndi bu yığıncağın sahibi kimi rolun adını müəyyən edir. FROM bəndi yüklənəcək montajın yerləşdiyi yolu müəyyən edir.

WITH PERMISSION_SET bəndi CREATE ASSEMBLY ifadəsinin çox vacib bəndidir və həmişə göstərilməlidir. O, montaj koduna verilən giriş hüquqlarının dəstini müəyyən edir. SAFE hüquqlar dəsti ən məhdudlaşdırıcıdır. Bu hüquqlara malik olan montaj kodu fayllar kimi xarici sistem resurslarına daxil ola bilməz. EXTERNAL_ACCESS hüquqlar dəsti montaj koduna müəyyən xarici sistem resurslarına daxil olmağa imkan verir, UNSAFE hüquqlar dəsti isə verilənlər bazası sisteminin daxilində və xaricində resurslara məhdudiyyətsiz girişi təmin edir.

Yığma kodu məlumatını saxlamaq üçün istifadəçi YARATMA ASSEMBLY bəyanatını verə bilməlidir. Montaj təlimatı yerinə yetirən istifadəçiyə (və ya rola) məxsusdur. Siz CREATE SCHEMA bəyanatının AVTORIZASYON bəndindən istifadə edərək montajın sahibini dəyişə bilərsiniz.

Database Engine həmçinin ALTER ASSEMBLY və DROP ASSEMBLY ifadələrini dəstəkləyir. DEĞİŞTİRİLMƏK BİLDİRİMİ quruluşu yeniləmək üçün istifadə olunur son versiya. Bu təlimat həmçinin müvafiq montajla əlaqəli faylları əlavə edir və ya silir. DROP təlimatı YAPILMA göstərilən montajı və bütün əlaqəli faylları cari verilənlər bazasından silir.

Aşağıdakı nümunə əvvəllər həyata keçirilən idarə olunan kod əsasında saxlanılan prosedurun necə yaradılacağını göstərir:

Nümunə Db-dən istifadə edin; GEDİN PROSEDUR YARATIN CountEmployees XARİCİ ADI KİMİ CLRStoredProcedures.StoredProcedures.CountEmployees

Nümunədəki CREATE PROCEDURE ifadəsi əvvəlki nümunələrdəki eyni ifadədən fərqlidir, çünki tərkibində XARİCİ AD parametri. Bu seçim kodun CLR tərəfindən yaradıldığını müəyyən edir. Bu cümlədəki ad üç hissədən ibarətdir:

assembly_name.class_name.method_name

    assembly_name - montajın adını müəyyən edir;

    class_name - ümumi sinfin adını müəyyən edir;

    metod_adı - isteğe bağlı hissə, sinif daxilində təyin olunan metodun adını təyin edir.

CountEmployees prosedurunun icrası aşağıdakı nümunədə göstərilmişdir:

Nümunə Db-dən istifadə edin; DECLARE @count INT EXECUTE @count = CountEmployees PRINT @count -- 7 qaytarır

PRINT bəyanatı İşçi cədvəlindəki cari sıra sayını qaytarır.

saxlanılan prosedur yalnız prosedurun yerləşdiyi verilənlər bazası kontekstində yerinə yetirildikdə mümkündür.

Saxlanılan prosedurların növləri

SQL Serverdə bir neçə növ var saxlanılan prosedurlar.

  • Sistemli saxlanılan prosedurlar müxtəlif inzibati tədbirlərin həyata keçirilməsi üçün nəzərdə tutulmuşdur. Demək olar ki, bütün server idarəetmə hərəkətləri onların köməyi ilə həyata keçirilir. Sistem deyə bilərik saxlanılan prosedurlar sistem cədvəlləri ilə işi təmin edən interfeysdir ki, bu da son nəticədə həm istifadəçi, həm də sistem verilənlər bazalarının sistem cədvəllərindən məlumatların dəyişdirilməsi, əlavə edilməsi, silinməsi və əldə edilməsi ilə bağlıdır. Sistemli saxlanılan prosedurlar sp_ ilə prefiks olunur, sistem verilənlər bazasında saxlanılır və istənilən digər verilənlər bazası kontekstində çağırıla bilər.
  • Xüsusi saxlanılan prosedurlar müəyyən tədbirlər həyata keçirmək. Saxlanılan prosedurlar- tam verilənlər bazası obyekti. Bunun nəticəsində hər biri saxlanılan prosedur yerinə yetirildiyi xüsusi verilənlər bazasında yerləşir.
  • Müvəqqəti saxlanılan prosedurlar yalnız qısa müddətə mövcuddur, bundan sonra onlar server tərəfindən avtomatik məhv edilir. Onlar yerli və qlobal bölünür. Yerli müvəqqəti saxlanılan prosedurlar yalnız yarandıqları əlaqədən çağırıla bilər. Belə bir prosedur yaratarkən ona tək # simvolu ilə başlayan ad verilməlidir. Bütün müvəqqəti obyektlər kimi, saxlanılan prosedurlar istifadəçi serveri ayırdıqda, yenidən işə saldıqda və ya dayandırdıqda avtomatik olaraq silinir. Qlobal müvəqqəti saxlanılan prosedurlar eyni proseduru olan istənilən server bağlantısı üçün mövcuddur. Onu müəyyən etmək üçün ona ## simvolları ilə başlayan bir ad vermək kifayətdir. Bu prosedurlar server yenidən işə salındıqda və ya dayandırıldıqda və ya kontekstində yaradıldıqları əlaqə bağlandıqda silinir.

Saxlanılan prosedurların yaradılması, dəyişdirilməsi və silinməsi

yaradılış saxlanılan prosedur aşağıdakı vəzifələrin həllini nəzərdə tutur:

  • növünü müəyyən edir saxlanılan prosedur: müvəqqəti və ya xüsusi. Bundan əlavə, öz sisteminizi yarada bilərsiniz saxlanılan prosedur, ona sp_ prefiksi ilə ad vermək və sistem verilənlər bazasına yerləşdirmək. Belə prosedur yerli serverdə istənilən verilənlər bazası kontekstində mövcud olacaq;
  • girişin planlaşdırılması. Yaradarkən saxlanılan prosedur nəzərə alın ki, o, verilənlər bazası obyektlərinə onu yaradan istifadəçi ilə eyni giriş hüquqlarına malik olacaq;
  • tərifi saxlanılan prosedur parametrləri. Əksər proqramlaşdırma dillərində olan prosedurlar kimi, saxlanılan prosedurlar giriş və çıxış parametrləri ola bilər;
  • kodun inkişafı saxlanılan prosedur. Prosedur kodu başqalarına zəng etmək də daxil olmaqla istənilən SQL əmrlərinin ardıcıllığını ehtiva edə bilər. saxlanılan prosedurlar.

Yenisini yaratmaq və mövcud olanı dəyişdirmək saxlanılan prosedur aşağıdakı komanda ilə edilir:

<определение_процедуры>::= (CREATE | ALTER ) procedure_name [;number] [(@parameter_name data type ) [=default] ][,...n] AS sql_statement [...n]

Bu əmrin parametrlərini nəzərdən keçirin.

sp_, #, ## prefikslərindən istifadə etməklə yaradılmış prosedur sistem və ya müvəqqəti prosedur kimi müəyyən edilə bilər. Komandanın sintaksisindən də göründüyü kimi, yaradılan prosedurun aid olacağı sahibin adının, habelə onun yerləşdirilməli olduğu verilənlər bazasının adının göstərilməsinə icazə verilmir. Beləliklə, yaradılmışları yerləşdirmək üçün saxlanılan prosedur xüsusi verilənlər bazasında siz həmin verilənlər bazası kontekstində CREATE PROCEDURE əmrini icra etməlisiniz. Bədəndən idarə edildikdə saxlanılan prosedur Qısaldılmış adlar eyni verilənlər bazasındakı obyektlər üçün istifadə edilə bilər, yəni verilənlər bazası adı göstərilmədən. Başqa verilənlər bazalarında yerləşən obyektlərə istinad etmək istədiyiniz zaman verilənlər bazası adının göstərilməsi məcburidir.

Addakı nömrə eyniləşdirmə nömrəsidir saxlanılan prosedur, onu bir qrup prosedurda unikal şəkildə müəyyən edir. Prosedurların idarə edilməsinin rahatlığı üçün məntiqi olaraq eyni tip saxlanılan prosedurlar onlara eyni ad, lakin fərqli identifikasiya nömrələri verilməklə qruplaşdırıla bilər.

Yaradılmış giriş və çıxış məlumatlarını ötürmək üçün saxlanılan prosedur parametrlərdən istifadə oluna bilər, onların adları yerli dəyişənlərin adları kimi @ simvolu ilə başlamalıdır. bir saxlanılan prosedur Siz vergüllə ayrılmış bir neçə variantı təyin edə bilərsiniz. Prosedurun gövdəsi adları prosedurun parametrlərinin adları ilə eyni olan yerli dəyişənlərdən istifadə etməməlidir.

Müvafiq olan məlumat növünü müəyyən etmək saxlanılan prosedur parametri, istənilən növ uyğundur SQL məlumatları, o cümlədən istifadəçi tərəfindən təyin olunanlar. Bununla belə, CURSOR məlumat növü yalnız olaraq istifadə edilə bilər çıxış parametri saxlanılan prosedur, yəni. OUTPUT açar sözü ilə.

OUTPUT açar sözünün olması o deməkdir ki, müvafiq parametr ondan məlumatları qaytarmaq üçün nəzərdə tutulub saxlanılan prosedur. Ancaq bu, heç də parametrin dəyərləri ötürmək üçün uyğun olmadığını ifadə etmir saxlanılan prosedur. OUTPUT açar sözünün təyin edilməsi serverdən çıxmağı əmr edir saxlanılan prosedur parametrin cari dəyərini prosedurun parametrin dəyəri kimi çağırıldığı zaman təyin edilmiş yerli dəyişənə təyin etmək. Nəzərə alın ki, OUTPUT açar sözünü təyin edərkən proseduru çağırarkən müvafiq parametrin dəyəri yalnız lokal dəyişəndən istifadə etməklə təyin edilə bilər. Normal parametrlər üçün icazə verilən hər hansı ifadə və ya sabitlərə icazə verilmir.

VARYING açar sözü ilə birlikdə istifadə olunur