Constrângeri de integritate de referință în cascadă

Utilizând constrângeri de integritate de referință cascadă, puteți defini acțiunile pe care le va efectua SQL Server când un utilizator încearcă să elimine sau să actualizeze o cheie pe care o indică alte chei externe existente.

Clauzele REFERENȚE ale instrucțiunilor CREATE TABLE și ALTER TABLE susțin instrucțiunile ON DELETE și ON UPDATE. Acțiunile în cascadă pot fi de asemenea definite utilizând caseta de dialog Conexiune cheie chei.

Valoarea prestabilită este NU acționată dacă clauzele ON DELETE și ON UPDATE nu sunt specificate.

DESPRE DELETE NU ACȚIUNE

Indică faptul că atunci când încercați să ștergeți un rând cu o cheie la care se face referire de cheile străine în rândurile altor tabele, ar trebui să raportați o eroare, iar pentru instrucțiunea DELETE să revineți.

ON UPDATE NO ACTION

Indică faptul că atunci când încercați să actualizați valoarea cheie indicată de cheile externe în rândurile altor tabele, trebuie să raportați o eroare și să redirecționați pentru instrucțiunea UPDATE.

Acțiunile CASCADE, SET NULL și SET DEFAULT vă permit să ștergeți și să actualizați valorile cheie care afectează tabelele în care sunt definite relațiile de chei străine, conducând la tabelul la care se fac modificările. Dacă s-au definit și acțiuni referențiale în cascadă pentru tabelele țintă, atunci aceste acțiuni în cascadă vor fi aplicate și la actualizarea sau ștergerea rândurilor corespunzătoare. Valoarea CASCADE nu poate fi specificată pentru cheile externe și primare din coloanele timestamp.

DESCHIDE CASCADE

Indică faptul că atunci când încercați să ștergeți un rând cu o cheie indicată de chei străine în rândurile altor tabele, toate rândurile care conțin aceste chei străine trebuie, de asemenea, să fie șterse.

ON CASCADE UPDATE

Indică faptul că atunci când încercați să actualizați o valoare cheie indicată de chei străine în rândurile altor tabele, toate valorile care alcătuiesc această cheie străină trebuie, de asemenea, să fie actualizate la noua valoare a cheii.

Valoarea CASCADE nu poate fi specificată dacă o coloană a timestampului face parte dintr-o cheie externă sau de referință.

Pe DELETE SET NULL

Indică faptul că atunci când încercați să ștergeți un rând cu o cheie indicată de cheile străine în rândurile altor tabele, toate valorile care alcătuiesc aceste chei străine trebuie să fie schimbate la NULL. Pentru a efectua această restricție, toate coloanele cheilor externe ale tabelei țintă trebuie să fie NULL.

PORNIT SETUP NULL

Indică faptul că atunci când încercați să actualizați o valoare cheie indicată de chei străine în rândurile altor tabele, toate valorile care alcătuiesc aceste chei străine trebuie să fie modificate la NULL. Pentru a efectua această restricție, toate coloanele cheilor externe ale tabelei țintă trebuie să fie NULL.

Pe setarea DELETE SET DEFAULT

Indică faptul că atunci când încercați să ștergeți un rând cu o cheie indicată de chei străine în rândurile altor tabele, toate valorile care alcătuiesc aceste chei străine trebuie să fie schimbate la valorile implicite. Pentru ca această restricție să fie îndeplinită, trebuie să fie definită o valoare implicită pentru toate coloanele cheilor străine ale tabelului țintă. Dacă coloana acceptă o valoare NULL și setul implicit de valori nu este setat explicit, NULL devine valoarea implicită implicită pentru această coloană. Toate proprietate a cerut ON DELETE SET valoarea implicită, alta decât NULL, trebuie să aibă valori corespunzătoare în tabelul de primar pentru a păstra integritatea constrângerile străine cheie.

PORNIRE DE SETARE UPDATE DEFAULT

Indică faptul că atunci când încercați să actualizați o valoare cheie indicată de chei străine în rândurile altor tabele, toate valorile care alcătuiesc aceste chei străine trebuie să fie modificate la valoarea implicită. Pentru ca această restricție să fie îndeplinită, trebuie să fie definită o valoare implicită pentru toate coloanele cheilor străine ale tabelului țintă. Dacă coloana acceptă o valoare NULL și setul implicit de valori nu este setat explicit, NULL devine valoarea implicită implicită pentru această coloană. Toate proprietate a cerut ON UPDATE SET valoarea implicită, alta decât NULL, trebuie să aibă valori corespunzătoare în tabelul de primar pentru a păstra integritatea constrângerile străine cheie.

Acțiunea de ON DELETE CASCADE nu poate fi specificată în tabelul pentru care este definită declanșatorul INSTEAD OF DELETE. Tabelele, care sunt definite declanseaza UPDATE INSTEAD, nu pot fi date următoarele etape: ON DELETE SET NULL, ON DEFAULT DELETE SET, ON UPDATE CASCADE, ON UPDATE SET NULL și ON UDATE SET DEFAULT.

Declarațiile individuale DELETE sau UPDATE pot începe o serie de acțiuni referențiale cascadate. De exemplu, baza de date conține trei tabele: TableA. TableB și TableC. Cheia externă a tabelului TableB este definită cu acțiunea ON DELETE CASCADE și este asociată cu cheia primară a tabelului TableA. Cheia externă a tabelului TableC este definită cu acțiunea ON DELETE CASCADE și este asociată cu cheia primară a tabelului TableB. Dacă instruciunea DELETE îndepărtează rândurile din tabelul TableA. aceeași operație va șterge toate rândurile din tabelul TableB. în care cheile externe coincid cu tastele primare eliminate din tabelul A. și apoi - pentru a șterge toate rândurile din tabelul TableC. în care cheile externe coincid cu tastele primare de la distanță ale tabelului TableB.

Secvențele acțiunilor referențiale cascadă, declanșate de instrucțiunile separate DELETE sau UPDATE, trebuie să formeze un arbore fără referințe circulare. Niciun tabel nu ar trebui să apară de mai multe ori în lista tuturor acțiunilor referențiale cascadă cauzate de instrucțiunile DELETE sau UPDATE. În plus, în arborele referențial cascadă, trebuie să existe o singură cale spre oricare dintre tabelele implicate. Orice ramificație din arbore este întreruptă imediat ce se întâlnește un tabel, pentru care se specifică acțiunea NO ACTION sau nu se specifică deloc nicio acțiune.

Acțiunile de referință în cascadă declanșează declanșatoarele AFTER UPDATE sau AFTER DELETE după cum urmează:

Toate acțiunile referențiale cascadice, cauzate direct de instrucțiunile inițiale DELETE sau UPDATE, sunt executate mai întâi.

Dacă există declanșatori AFTER după tabelele modificate, aceste declanșatoare sunt declanșate după executarea tuturor acțiunilor cascadă. Aceste declanșatoare sunt declanșate în ordinea inversă a acțiunilor în cascadă. Dacă sunt definite mai multe declanșatoare pentru o singură masă, acestea sunt declanșate într-o ordine aleatoare, cu excepția cazului în care se specifică prima și ultima declanșator selectată din tabel. Această comandă este determinată de procedura sp_settriggerorder.

Dacă secvențele acțiunilor în cascadă provin dintr-o tabelă care a fost ținta imediată a unei acțiuni DELETE sau UPDATE, ordinea de declanșare pentru aceste declanșatoare nu este definită. Cu toate acestea, o secvență de acțiuni pornește întotdeauna toate declanșatoarele înainte ca următoarea să o facă.

Se declanșează declanșarea tabelului AFTER, care este ținta imediată a acțiunii DELETE sau UPDATE, indiferent dacă au fost modificate oricare șiruri de caractere. În acest caz, cascadarea nu afectează alte tabele.

Dacă unul dintre declanșatoarele anterioare efectuează o operație DELETE sau UPDATE pe alte tabele, aceste operații pot invoca propriile secvențe de acțiune în cascadă. Aceste fluxuri secundare de lucru sunt procesate pentru fiecare operație DELETE sau UPDATE după ce toate declanșatoarele secvențelor de activitate primară sunt executate. Acest proces poate fi repetat repetat pentru operațiile ulterioare DELETE sau UPDATE.

Executarea funcțiilor CREATE, ALTER, DELETE sau a altor operațiuni DDL din declanșatoare poate declanșa declanșatoare DDL. Acest lucru poate duce la operațiuni suplimentare DELETE sau UPDATE care vor porni secvențe suplimentare de acțiuni în cascadă și vor lansa declanșatoarele lor.

În cazul în care, în orice anumită secvență de acțiuni în cascadă referențiale o eroare apare în această secvență nu va rula orice declanșează după aceea, și pentru operarea sau DELETE, UPDATE care a creat această secvență va fi derulată înapoi.

Tabelul pentru care este definită declanșatorul INSTEAD OF de declanșare poate avea, de asemenea, o clauză REFERENCES indicând o anumită acțiune în cascadă. Cu toate acestea, declanșarea AFTER a tabelului țintă în cascadă poate executa o instrucțiune INSERT, UPDATE sau DELETE pentru alt tabel sau vizualizare care declanșează INSTEAD of trigger pentru acest obiect.