Declanșatoare: crearea și aplicarea. Declanșează exemple de declanșatoare simple MS SQL

Deja multe articole de pe Internet au despre SQL declanșatoare despre SQL, dar voi adăuga unul cu exemple adecvate pentru a consolida materialul pentru cei care sunt "în subiect" și care ar fi mai bine să înțeleagă materialul celor care tocmai au început să înțeleagă "Zen SQL". În același timp, și creați o discuție pe această temă.

Faceți imediat o rezervare că opinia mea este doar opinia mea, uneori este foarte categorică. Datorită mai multor motive, este necesar să se lucreze cu site-uri de înaltă încărcare și aplicații web complexe.

Din lucrările de pe ele, a fost efectuată o experiență valoroasă - urmați prioritățile și statisticile. Ce înseamnă? Totul este simplu: dacă aveți un blog și are 2-3-4-10012 milioane de vizitatori pe zi, iar articolele sunt scrise doar 1-2-3435 ori pe zi (un ordin de mărime mai mic decât numărul de opinii) , apoi viteza de conservare a articolului (și complexitatea acestui fapt) în raport cu viteza de indicare a articolului poate fi proporțional mai mică. Cu cât arată mai mult, spectacolul este spectacolul și nu conservarea articolului / paginii / tabelului. Ceea ce nu înseamnă că este posibil să vă relaxați. Conservarea articolului pentru 3-5-10 secunde în blog se află în cadrul adecvării, dar generația paginii pentru mai mult de 2 secunde (+ în timp ce scripturile și stilurile cu imagini se vor încărca) - este pe punctul de a "Ce site-ul brazat, am citit altceva", și mai rău, voi cumpăra într-un alt loc ".

Dacă luăm site-ul mediu cu votul / karma, comentariile, un contor de pagină etc., atunci mulți dezvoltatori vin în minte desenele ca selectați Count (*) de la comentariu Unde comentează.page \u003d Page_id. Gândiți-vă la fiecare articol pentru a calcula valoarea ratingului, valoarea comentariilor. Și avem pe articolele noastre principale din fiecare secțiune. Atunci când participarea la 10 persoane pe secundă, în medie VPS, vă puteți permite 70-100 de interogări SQL pe pagină (Hello, Bitrix).

Dar la linia versurilor (trase deja, probabil). Datele goale:

Blog de masă.

Creați tabelul dacă nu există "Blog" (ID` INT (11) nu NULL Auto_increment, `Titlul" Varchar (128) Nu NULL, "Textul textului nu NULL,` Creation` Datetime Nu Null, `Modificarea" Datetime Nu NULL, 'img` varchar (128) nu NULL implicit "implicit.png", `starea" Tinyint (4) Nu Null implicit "2", `user_id` Int (11) Nu Null,` Rata "Int (11) Nu NULL, `relax_type` tinyint (4) nu ,` cronometre "Timestamp, nu null implicit curent_Timestamp,` Concursul "Tinyint (1) nu Null implicit" 0 ",` Vizualizări` Int (11) Nu Null Implicit "0", comenteaza ` int (11) nu nul, `url` varchar (128) nu , cheia primară (` id`), cheia unică "(` url "), key 'country_id` (` country_id`), key' user_id ` (`user_id`), tasta` starea "(` starea ") motor \u003d Charset implicit INNODB \u003d UTF8 auto_increment \u003d 1456435;

Comentarii Tabelul

Creați tabelul dacă nu există "Comentarii" (`` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `implicit ,` user_id `Int (12) implicit ,` Text`te, `Creation` Timestamp Null implicit Current_Timestamp,` Stare "Int (1) Nu NULL implicit" 0 ", tasta primară (` id`), key 'proprietar_name` (proprietar_name `,` proprietar_id`), tasta `părinte_id` (` părinte_id`) motor \u003d Myisam Charset implicit \u003d utf8 auto_increment \u003d 243254252;

După cum puteți vedea, în tabelul blog, fiecare articol are un contra comentarii (câmp de comentarii).
Practică simplă:
1. Adăugat un comentariu - a crescut contorul pentru blog
2. eliminat / ascuns un comentariu - a redus contorul.
Faceți acest lucru în cod este convenabil și obișnuit, dar există un instrument mai convenabil - declanșatoare.

Și așa avem 2 evenimente (de fapt 3): Crearea unui comentariu și ștergerea (cel de-al treilea eveniment este o schimbare a stării sale ("Ștergere", interzicere etc.).
Luați în considerare numai crearea și ștergerea și lăsați statutul să fie o temă.

În exemplul există o singură caracteristică: comentariile pot fi la mai multe tipuri de articole.

Crearea unui comentariu:

Creați declanșatorul "Add_Count_Comment` după introducerea pe" comentariile "pentru fiecare rând începe // Utilizator în contul personal, consider cât de mult comentariu a scris actualizarea utilizatorului set user.countcomment \u003d user.countcomment + 1 unde user.id \u003d New.user_id; // determina ce comentariul se referă și de a mări imediat contorul în aceste tabele cazuri Nou .id \u003d New.`owner_id`; Când "articol", apoi actualizați "setul" articol "." Comentariu "\u003d" Articol "." Comentariu "+ 1 unde" articolul ".`id` \u003d Nou.`id` Când "populați", apoi actualizați "populați_PLAY" set `populate_place`. Comentariu" \u003d Populate_Place`. `Comment` + 1 unde" populate_place`.`id` \u003d New.owner_id`; Cazul final; // aici vă vom facilita slujba cu Panglici de știri // articole de adrese URL pe care le scrieți imediat, astfel încât atunci nu faceți eșantioane de caz inutil Nou `` id \u003d nou.`owner_id`); Când "articol" apoi setați uperrl \u003d (Selectați adresa URL de la "articolul" în cazul în care articolul.Id \u003d nou.`owner_id`); Când "populați" apoi setați userurl \u003d ``; Cazul final; // numele articolului este imediat scris, deci, dacă nu pentru a face un eșantion de caz nou.`owner_name` Ce "blog" apoi setați USERTLE \u003d (selectați titlu de la "blog`wer_id`); Când "articol" apoi setați UserTitle \u003d (Selectați titlul de la "articolul" în cazul în care articolul.id \u003d nou.`owner_id`); Când "populați" apoi setați UserTitle \u003d ``; Cazul final; Introduceți în valorile utilizator_has_events (New.user_id, New.ID, "comentarii", acum (), userurl, useritle); Sfârșit.

În mod similar și eliminarea Comentariu:

Creați declanșatorul "Del_Count_Comment` După ștergerea pe" comentariile "pentru fiecare rând începeți actualizarea setului de utilizatori Utilizator.CountComment \u003d User.CountComment -1 unde User.Id \u003d Old.user_id; Cazul vechi .`owner_name` Ce "blog", apoi actualizați "Blog" Blog` Blog`.`comment` (`Blog`. Comentariu" 1, unde "Blog`id`id` \u003d Old.`owner_id`; Când "articolul", apoi actualizarea articolului "Articolul" articol ". Comentariu" ("articolul` `` Comentariu`-1 Unde `` `` `` `` `` Când "populați", apoi actualizați "populați_PLAY" set `popula_place`.Comment` \u003d` populate_place`. Comentariu`-1 unde "populate_place`.`id` \u003d Old.owner_id`; Cazul final; Sfârșit.

Și deci ce a primit:
1. Când introduceți un comentariu, suntem utilizați automat de serverul SQL, cantitatea de comentarii pe un anumit obiect de comentariu (articol, pagină, note)
2. Am format feedul de știri (Bună ziua tuturor rețelelor sociale etc.)
3. Când un comentariu este șters, avem deducerea tuturor datelor.
4. Nu am folosit cadrul.
5. Eșantionul de toate datele necesare apare rapid (numai 1 solicitare când este afișată pagina, cu excepția altor date "stânga" de pe acesta.)

Și avem un Sfinx care face periodic eșantionul de articole care s-au schimbat în ultimul moment. Pentru a face acest lucru, blogul are un câmp de modificare.

Adăugat declanșator:

Creați declanșatorul "ins_blog" înainte de introducerea pe "Blog` // Faceți inserarea înainte de a salva informații prin" substituire "de date. Pentru fiecare rând, începeți setați New.Modificarea \u003d acum (); Sfârșit.

Acum, făcând eșantionul pentru ultimul moment, vom obține toate documentele care au fost adăugate pentru ultimul minut.

Creați declanșator `ins_blog` înainte de a actualiza pe" Blog` // efectuați o inserție înainte de a salva informații de "substituire" de date. Pentru fiecare rând, începeți setați New.Modificarea \u003d acum (); Sfârșit.

La schimbarea datelor, voi actualiza și indicele de căutare.

De obicei, un proiect mediu, tot ce poate fi transferat pe partea SQL Server este transferat. Serverul SQL însuși face astfel de operațiuni mai rapid și cu resurse mai mici decât se pot face prin limbajul de programare utilizat.

UPD: Cholivar dedicat fezabilității complicației structurii DB este declarat deschis.

Trigger:

<Определение_триггера>:: \u003d (creați | alter) Nume trigger_trigger pe (name_table | Imprimare Nume ((pentru | după | în loc de) ([Ștergere] [,] [inserat] [,] [actualizare]) [cu APPLAD] [Nu pentru Replicare] ca operator SQL_ [... N]) | ((pentru | după | în loc de) ([,]) [cu APPLAD] [nu pentru replicare] [(dacă actualizare) Actualizare (și | interval_name)] [. .. N] | Dacă (Columns_Updates () (operator_bit_purpace) bit_maska_imament) (operator_bit_sob) Bit_mask [... N]) SQL_ Operator [... N]))

Triggerul poate fi creat numai în baza de date curentă, dar este permisă să circule în declanșatorul în alte baze de date, inclusiv situat pe un server de la distanță.

Luați în considerare numirea argumentelor de la creare Alter declanșator.

Numele declanșatorului trebuie să fie unic în baza de date. În plus, puteți specifica numele proprietarului.

Când specificați argumentul cu criptare, serverul criptează codul de declanșare, astfel încât nimeni, inclusiv administrator, nu îl poate accesa și îl poate citi. Criptarea este adesea folosită pentru a ascunde algoritmii de procesare a datelor drepturilor de autor, care sunt proprietatea intelectuală a unui programator sau a unui secret comercial.

Tipuri de declanșatoare

În SQL Server, există doi parametri care determină comportamentul declanșatorilor:

  • După. Triggerul este efectuat după executarea cu succes a comenzilor sale. Dacă comenzile din orice motiv nu pot fi finalizate cu succes, declanșatorul nu este executat. Trebuie remarcat faptul că datele se schimbă ca urmare a executării solicitării utilizatorului și executarea declanșatorului este efectuată în organismul unei singure tranzacții: dacă apare o reducere de declanșare, iar modificările utilizatorilor vor fi respinse. Puteți defini mai multe afterriggers pentru fiecare operație (introduceți, actualizați, ștergeți). Dacă tabelul este prevăzut pentru executarea mai multor aftertriggers, utilizând procedura stocată de sistemul SP_SETTRIGGERderder, puteți specifica care dintre ele va fi efectuată mai întâi și care este ultima. În mod implicit, în SQL Server, toate declanșatoarele sunt după declanșatoare.
  • In loc de. Triggerul este numit în loc de execuție a comenzilor. Spre deosebire de Afteradrigger, în loc de -trigger poate fi definit atât pentru tabel, cât și pentru prezentare. Pentru fiecare inserție, actualizare, puteți defini numai unul în loc de -trigger.

Declanșatoarele disting tipul de comenzi la care reacționează.

Există trei tipuri de declanșatoare:

  • Inserați declanșatorul - începeți când încercați să introduceți date utilizând comanda Insert.
  • Actualizați declanșatorul - începeți când încercați să modificați datele utilizând comanda Actualizare.
  • Ștergeți declanșatorul - începeți când încercați să ștergeți datele utilizând comanda DELETE.

Desene [DELETE] [,] [Insert] [,] [actualizare] și Pentru |. După aceea | In loc de) ([,] Determinați ce comandă să reacționați declanșatorul. Când creează, trebuie să fie specificată cel puțin o echipă. Permis creând un declanșatorrăspunzând la două sau la toate cele trei echipe.

Argumentul cu APPLAD vă permite să creați mai multe declanșatoare de fiecare tip.

Pentru crearea de declanșare Cu argumentul nu pentru replicare, este interzisă să o porniți în timpul executării modificării meselor de replicare a mecanismelor de replicare.

Designul ca operator SQL_ [... n] definește un set de operatori SQL și comenzi care vor fi executate atunci când declanșatorul este pornit.

Trebuie remarcat faptul că o serie de operațiuni nu sunt permise în interiorul declanșatorului, cum ar fi:

  • crearea, modificarea și ștergerea bazei de date;
  • restaurarea unei baze de date de rezervă sau a jurnalului de tranzacții.

Execuția acestor comenzi nu este permisă, deoarece acestea nu pot fi anulate dacă tranzacția se va întoarce în care este efectuat declanșatorul. Această interdicție este puțin probabil să afecteze cumva funcționalitatea declanșatorilor creați. Este dificil să găsiți o astfel de situație în care, de exemplu, după schimbarea rândului mesei, va trebui să restaurați backupul jurnalului de tranzacții.

Programarea declanșatorului

Când efectuați adăugarea de comenzi, schimbați și ștergeți înregistrările, serverul creează două tabele speciale: inserat. și șters.. Acestea conțin linii de șiruri care vor fi introduse sau șterse la finalizarea tranzacției. Structura tabelului introdus și șters este identică cu structura tabelului pentru care este determinat declanșatorul. Pentru fiecare declanșator, se creează un set de mese introduse și șterse, astfel încât nici un alt declanșator nu le poate accesa. În funcție de tipul de operație care a provocat execuția de declanșare, conținutul tabelelor introduse și șterse poate fi diferit:

  • comanda inserați - în tabelul inserat conține toate liniile pe care utilizatorul încearcă să le introducă în tabel; Nu vor exista linii în tabelul șters; După terminarea declanșării, toate rândurile din tabelul inserat se vor deplasa la tabelul sursă;
  • Ștergerea comenzii - în tabelul șters va conține toate liniile pe care utilizatorul le va încerca să le elimine; Triggerul poate verifica fiecare linie și poate determina dacă este permisă eliminarea acestuia; Tabelul inserat nu va fi nici o linie;
  • actualizați comanda - Când executați-o în tabelul șters, există valori vechi rânduri care vor fi șterse după finalizarea cu succes.

Declanșator (baze de date)

Trigger. (eng. declanșator.) - aceasta este procedura stocată a unui tip special pe care utilizatorul nu le provoacă în mod direct și a cărei executare se datorează acțiunii prin modificarea datelor: prin adăugarea de inserții, ștergeți o linie de ștergere într-o tabelă specificată sau prin schimbare datele de actualizare într-o coloană specifică a unei tabele baze de date relaționale specificate. Declanșatoarele sunt aplicate pentru a asigura integritatea datelor și implementarea logicii complexe de afaceri. Triggerul rulează automat serverul când încercați să modificați datele din tabelul cu care este conectat. Toate modificările de date produse de acestea sunt considerate ca fiind efectuate în tranzacția în care a fost efectuată acțiunea care a cauzat declanșarea declanșatorului. În consecință, în cazul detectării unei erori sau a întreruperii integrității datelor, poate apărea această reducere a tranzacției.

Momentul de declanșare a declanșatorului este determinat utilizând cuvintele cheie înainte (declanșatorul începe să efectueze evenimentul asociat; de exemplu, înainte de a adăuga înregistrarea) sau după (după eveniment). În cazul în care declanșatorul este apelat în fața evenimentului, acesta poate face modificări la evenimentul modificat de eveniment (desigur, cu condiția ca evenimentul să nu știe înregistrarea). Unele DBM-uri impun restricții asupra operatorilor care pot fi utilizați într-un declanșator (de exemplu, este interzis să se facă modificări la tabelul pe care declanșatorul "agățat" etc.)

În plus, declanșatoarele pot fi legate de masă, dar la reprezentare (vedere). În acest caz, cu ajutorul lor, este implementat mecanismul de "reprezentare actualizată". În acest caz, cuvintele cheie înainte și referter afectează numai secvența apelurilor de declanșare, deoarece evenimentul însuși (ștergerea, inserarea sau actualizarea) nu apare.

În unele servere, declanșatoarele pot fi numite pentru fiecare înregistrare modificabilă, dar o dată pentru a schimba tabelul. Astfel de declanșatoare sunt numite comprimate.

Exemplu (Oracle):

/ * Declanșator la nivelul tabelului * / Creați sau înlocuiți declanșatorul DistrictUpdatTtrigger după actualizarea On Distir începe să inserați în valorile informațiilor ( "Masa" Districtul "sa schimbat"); Sfârșit;

În acest caz, pentru diferențele dintre declanșatoarele tabulare, sunt introduse cuvinte cheie suplimentare din litere mici atunci când descrie declanșatoarele de linie. În Oracle, aceasta este o frază pentru fiecare rând.

/ * Declanșator la nivelul șirului * / Creați sau înlocuiți declanșatorul DistrictUpdatttrigger după actualizare în district pentru fiecare rând începe să inserați în valorile informațiilor ( "Un șir în tabelul" District "sa schimbat"); Sfârșit;


Fundația Wikimedia. 2010.

  • Gospodărie
  • Spectroscopie

Urmăriți ceea ce este "declanșator (baze de date)" în alte dicționare:

    Prezentare (baze de date) - Acest termen are alte semnificații, vezi prezentarea. Prezentare (eng. Vedere, mai mult consonant nu este numele standard "View", în programatorii de sală este adesea folosit ca împrumut de la britanic "legat", "orb") ... ... Wikipedia

    Baze de date ierarhice - Modelul ierarhic al bazei de date constă din obiecte cu indicații de la obiecte părinte la descendenți, conectând împreună informațiile aferente. Bazele de date ierarhice pot fi reprezentate ca un copac constând din obiecte de diferite nivele. ... ... Wikipedia

    Baze de date relaționale - Baza de date relațională bazată pe un model de date relațional. Cuvântul "relațional" vine din limba engleză. Relație. Bazele de date relaționale sunt utilizate pentru a lucra cu baze de date relaționale. Utilizarea bazelor de date relaționale a fost ... ... Wikipedia

    Index (baze de date) - Acest termen are alte valori, a se vedea indicele. Index (Index English) Obiectul bazei de date creat pentru a îmbunătăți performanța căutării datelor. Tabelele din baza de date pot avea un număr mare de linii stocate în ... Wikipedia

    Cursor (bază de date) - Acest termen are alte semnificații, vezi cursorul (valorile). Cursor Referință la zona de memorie de context [sursa nu este specificată 126 de zile]. În unele implementări ale limbii logice informative SQL (Oracle, ... ... Wikipedia

    Declanșator (valori) - Trigger (eng. declanșator în sensul unui substantiv "Doggy, un zăvor, un declanșator într-un sens general, ducând la un element în acțiune"; în sensul verbului "acționând"): În limba rusă, termenul este Inițial din regiune ... ... Wikipedia

    Refactorizarea bazei de date - (Ing. Refactoring de bază de date) Aceasta este o schimbare simplă a schemei bazei de date, care ajută la îmbunătățirea proiectului său, menținând în același timp semantică funcțională și informativă. Cu alte cuvinte, consecința refactorizării bazei de date nu poate fi ... ... wikipedia

    Bază de date - solicitarea "BD" este redirecționată aici; A se vedea și alte valori. Baza de date prezentată într-un obiectiv formează o combinație de materiale independente (articole, calcule, reglementări, hotărâri judecătorești și alte materiale similare), ... ... Wikipedia

    Proiectarea bazei de date - procesul de creare a unei scheme de baze de date și determinarea restricțiilor de integritate necesare. Cuprins 1 Sarcini de proiectare de baze de date ... Wikipedia

    Model de date - În teoria bazei de date clasice, modelul de date este o teorie oficială de prezentare și prelucrare a datelor în sistemul de gestionare a bazelor de date (DBMS), care include cel puțin trei aspecte: 1) Aspectul structurii: Metode care descriu tipurile și .... .. wikipedia.

Este dată o definiție a declanșatorului, zona de utilizare, locul și rolul unui declanșator în asigurarea integrității datelor. Descrie tipurile de declanșatoare. Creați operatori, modificați, ștergeți declanșatorul sunt luate în considerare. Programarea declanșatorului este ilustrată prin exemple de creare a declanșatorilor pentru a pune în aplicare limitele integrității și pentru a colecta date statistice.

Definiția declanșatorului în SQL Language Standard

Declanșatoarele sunt una dintre soiurile procedurilor stocate. Execuția lor are loc atunci când este executată pentru tabelul oricărui operator de limbă de manipulare a datelor (DML). Declanșatoarele sunt utilizate pentru a verifica integritatea datelor, precum și pentru a relua tranzacțiile.

Triggerul este o procedură SQL compilată, a căror execuție se datorează debutului anumitor evenimente în baza de date relațională. Utilizarea declanșatorilor este cea mai mare parte convenabilă pentru utilizatorii de baze de date. Și totuși, utilizarea lor este adesea asociată cu costuri suplimentare de resurse asupra operațiunilor I / O. În cazul în care aceleași rezultate (cu costuri mult mai puțin de producție a resurselor) pot fi realizate utilizând proceduri stocate sau programe de aplicații, utilizarea declanșatorilor este inadecvată.

Declanșatoare - un instrument special SQL Server folosit pentru a menține integritatea datelor din baza de date. Cu ajutorul restricțiilor, regulilor și valorilor implicite de integritate, nu este întotdeauna posibilă obținerea nivelului dorit de funcționalitate. Este adesea necesar să se implementeze algoritmi complexi de verificare a datelor care să garanteze acuratețea și realitatea acestora. În plus, uneori este necesar să urmăriți modificările valorilor tabelului pentru a modifica corect datele asociate. Declanșatoarele pot fi considerate ca un fel de filtre care intră în acțiune după efectuarea tuturor operațiunilor în conformitate cu regulile, valorile standard etc.

Triggerul este un tip special de proceduri stocate care rulează automat serverul atunci când încercați să modificați datele din tabele cu care sunt conectate declanșatoarele. Fiecare declanșator este legat de o masă specifică. Toate modificările de date produse de acestea sunt tratate ca o tranzacție. În caz de detectare a erorilor sau întreruperea integrității datelor, această tranzacție se rotește înapoi. Făcând astfel schimbările interzise. Toate modificările făcute deja de declanșator sunt anulate.

Creează un declanșator numai proprietarul bazei de date. Această limitare vă permite să evitați schimbarea accidentală a structurii tabelelor, metodelor de comunicare cu alte obiecte etc.

Triggerul este foarte util și, în același timp, un agent periculos. Astfel, cu o logică incorectă a activității sale, puteți distruge cu ușurință o bază de date întreagă, astfel încât declanșatoarele trebuie să fie cu debuggeri foarte atent.

Spre deosebire de subprogramul obișnuit, declanșatorul este impus implicit în fiecare caz eveniment declansatorÎn plus, el nu are argumente. Aducerea în acțiune este uneori numită lansarea declanșatorului. Cu ajutorul declanșatorilor, se realizează următoarele obiective:

  • verificarea corectitudinii datelor introduse și efectuarea de restricții complexe de integritate a datelor care sunt dificile dacă este posibil să se mențină în general cu ajutorul constrângerilor de integritate instalate pentru tabel;
  • emiterea de avertismente care seamănă cu necesitatea de a efectua anumite acțiuni la actualizarea tabelului, implementate într-un anumit mod;
  • acumularea informațiilor de audit prin stabilirea informațiilor despre modificările și cele care le-au completat;
  • suport pentru replicare.

Formatul principal al comenzii Creare Trigger este prezentat mai jos:

<Определение_триггера>:: \u003d creați trigger name_trigger înainte | După<триггерное_событие> PE.<имя_таблицы> <тело_триггера>

evenimente de declanșare Constau din inserarea, ștergerea și actualizarea șirurilor în tabel. În ultimul caz pentru eveniment declansator Puteți specifica numele specifice ale coloanelor de masă. Timpul de începere a declanșatorului este determinat utilizând cuvintele cheie înainte (declanșatorul începe să efectueze evenimentele asociate) sau după (după executarea lor).

Acțiunile efectuate de declanșator sunt stabilite pentru fiecare rând (pentru fiecare rând) acoperite de acest eveniment sau numai o singură dată pentru fiecare eveniment (pentru fiecare declarație).

Desemnare <список_старых_или_новых_псевдонимов> Se referă la astfel de componente ca o linie veche sau nouă (veche / nouă) sau o masă veche sau nouă (masă veche / tabel nou). Este clar că vechile valori nu sunt aplicabile pentru evenimentele de inserare și cele noi - pentru evenimente de ștergere.

Sub rezerva utilizării corecte, declanșatoarele pot deveni un mecanism foarte puternic. Principalul avantaj al avantajului lor este că funcțiile standard sunt stocate în interiorul bazei de date și sunt activate în mod constant de fiecare dată când este actualizată. Poate simplifica semnificativ aplicațiile. Cu toate acestea, ar trebui menționate dezavantajele inerente declanșatorului:

  • dificultate: la mutarea unor funcții, sarcinile de proiectare, implementare și administrare sunt complicate;
  • funcționalitate ascunsă: Transferul unei părți a funcțiilor la baza de date și salvarea acestora sub formă de unul sau mai multe declanșatoare uneori conduce la ascundere de la utilizatorul unor funcționalități. Deși simplifică într-o anumită măsură, dar, din păcate, poate provoca efecte secundare neplanificate, potențial nedorite și dăunătoare, deoarece, în acest caz, utilizatorul nu poate controla toate procesele care apar în baza de date;
  • impactul asupra performanței: Înainte de a efectua fiecare comandă pentru a modifica starea bazei de date DBMS, trebuie să verificați condiția de declanșare pentru a afla nevoia de a începe declanșatorul pentru această comandă. Execuția acestor calcule afectează performanța generală a DBMS, iar la momentele încărcării de vârf, scăderea acestuia poate fi deosebit de vizibilă. Evident, cu o creștere a numărului de declanșatoare, costurile generale asociate cu o astfel de operațiuni cresc.

În mod incorect, declanșatoarele scrise pot duce la probleme grave, cum ar fi apariția blocărilor "moarte". Declanșatoarele sunt capabile să blocheze multe resurse pentru o lungă perioadă de timp, atât de o atenție deosebită ar trebui acordată minimizării conflictelor de acces.

Implementarea declanșatorilor în MS SQL Server MS

În implementarea MS SQL Server DBMS, se utilizează următorul operator de creare sau schimbare a declanșatorului:

<Определение_триггера>:: \u003d \u003d (creați | alter) Trigger_Rrigger Nume On (name_name | View_name) ((pentru | După | în loc de) ([Ștergere] [,] [Insert] [,] [actualizare]) [cu APPLAD] [nu pentru replicare ] Ca operator SQL_ [... N]) | ((pentru | după | în loc de) ([,]) [cu APPLAD] [nu pentru replicare] [(dacă actualizare) Actualizare (și | interval_name)] [.. . N] \u200b\u200b| Dacă (Columns_Updates () (operator_bit_purpace) bit_maska_imament) (operator_bit_sob) Bit_mask [... N]) SQL_ Operator [... N]))

Triggerul poate fi creat numai în baza de date curentă, dar este permisă să circule în declanșatorul în alte baze de date, inclusiv situat pe un server de la distanță.

Luați în considerare numirea argumentelor de la creare Alter declanșator.

Numele declanșatorului trebuie să fie unic în baza de date. În plus, puteți specifica numele proprietarului.

Când specificați argumentul cu criptare, serverul criptează codul de declanșare, astfel încât nimeni, inclusiv administrator, nu îl poate accesa și îl poate citi. Criptarea este adesea folosită pentru a ascunde algoritmii de procesare a datelor drepturilor de autor, care sunt proprietatea intelectuală a unui programator sau a unui secret comercial.

Tipuri de declanșatoare

În SQL Server, există doi parametri care determină comportamentul declanșatorilor:

  • După. Triggerul este efectuat după executarea cu succes a comenzilor sale. Dacă comenzile din orice motiv nu pot fi finalizate cu succes, declanșatorul nu este executat. Trebuie remarcat faptul că datele se schimbă ca urmare a executării solicitării utilizatorului și executarea declanșatorului este efectuată în organismul unei singure tranzacții: dacă apare o reducere de declanșare, iar modificările utilizatorilor vor fi respinse. Puteți defini mai multe afterriggers pentru fiecare operație (introduceți, actualizați, ștergeți). Dacă tabelul este prevăzut pentru executarea mai multor aftertriggers, utilizând procedura stocată de sistemul SP_SETTRIGGERderder, puteți specifica care dintre ele va fi efectuată mai întâi și care este ultima. În mod implicit, în SQL Server, toate declanșatoarele sunt după declanșatoare.
  • In loc de. Triggerul este numit în loc de execuție a comenzilor. Spre deosebire de Afterter -trigger, în loc de -trigger poate fi definit atât pentru masă, cât și pentru vizualizare. Pentru fiecare inserție, actualizare, puteți defini numai unul în loc de -trigger.

Declanșatoarele disting tipul de comenzi la care reacționează.

Există trei tipuri de declanșatoare:

  • Inserați declanșatorul - începeți când încercați să introduceți date utilizând comanda Insert.
  • Actualizați declanșatorul - începeți când încercați să modificați datele utilizând comanda Actualizare.
  • Ștergeți declanșatorul - începeți când încercați să ștergeți datele utilizând comanda DELETE.

Desene [DELETE] [,] [Insert] [,] [actualizare] și Pentru |. După aceea | In loc de) ([,] Determinați ce comandă să reacționați declanșatorul. Când creează, trebuie să fie specificată cel puțin o echipă. Permis creând un declanșatorrăspunzând la două sau la toate cele trei echipe.

Argumentul cu APPLAD vă permite să creați mai multe declanșatoare de fiecare tip.

Pentru crearea de declanșare Cu argumentul nu pentru replicare, este interzisă să o porniți în timpul executării modificării meselor de replicare a mecanismelor de replicare.

Designul ca operator SQL_ [... n] definește un set de operatori SQL și comenzi care vor fi executate atunci când declanșatorul este pornit.

Trebuie remarcat faptul că o serie de operațiuni nu sunt permise în interiorul declanșatorului, cum ar fi:

  • crearea, modificarea și ștergerea bazei de date;
  • restaurarea unei baze de date de rezervă sau a jurnalului de tranzacții.

Execuția acestor comenzi nu este permisă, deoarece acestea nu pot fi anulate dacă tranzacția se va întoarce în care este efectuat declanșatorul. Această interdicție este puțin probabil să afecteze cumva funcționalitatea declanșatorilor creați. Este dificil să găsiți o astfel de situație în care, de exemplu, după schimbarea rândului mesei, va trebui să restaurați backupul jurnalului de tranzacții.

Programarea declanșatorului

Când efectuați adăugarea de comenzi, schimbați și ștergeți înregistrările, serverul creează două tabele speciale: inserat. și șters.. Acestea conțin linii de șiruri care vor fi introduse sau șterse la finalizarea tranzacției. Structura tabelului introdus și șters este identică cu structura tabelului pentru care este determinat declanșatorul. Pentru fiecare declanșator, se creează un set de mese introduse și șterse, astfel încât nici un alt declanșator nu le poate accesa. În funcție de tipul de operație care a provocat execuția de declanșare, conținutul tabelelor introduse și șterse poate fi diferit:

  • comanda inserați - în tabelul inserat conține toate liniile pe care utilizatorul încearcă să le introducă în tabel; Nu vor exista linii în tabelul șters; După terminarea declanșării, toate rândurile din tabelul inserat se vor deplasa la tabelul sursă;
  • Ștergerea comenzii - în tabelul șters va conține toate liniile pe care utilizatorul le va încerca să le elimine; Triggerul poate verifica fiecare linie și poate determina dacă este permisă eliminarea acestuia; Tabelul inserat nu va fi nici o linie;
  • actualizați comanda - Când executați-o în tabelul șters, există valori vechi rânduri care vor fi șterse atunci când declanșatorul este finalizat cu succes. Valorile noi ale rândurilor sunt conținute în tabelul inserat. Aceste linii vor fi adăugate la tabelul sursă după executarea cu succes a declanșatorului.

Pentru informații despre numărul de rânduri, care vor fi modificate când declanșatorul este finalizat cu succes, puteți utiliza funcția @@ Rowcount; Acesta returnează numărul de rânduri tratate cu ultima comandă. Trebuie subliniat faptul că declanșatorul este lansat fără a încerca să schimbe șirul specific și la momentul executării comenzii de schimbare. O astfel de echipă afectează setul de linii, astfel încât declanșatorul să proceseze toate aceste linii.

Dacă declanșatorul a constatat că de la 100 de șiruri introduse, variabile sau șterse, numai unul nu satisface cu unul sau altul, atunci nu va fi introdus nici un șir, schimbat sau șters. Un astfel de comportament se datorează cerințelor tranzacției - fie toate modificările, fie oricine trebuie efectuate.

Triggerul este realizat ca o tranzacție implicită definită, astfel încât comenzile de control al tranzacțiilor sunt permise în interiorul declanșatorului. În special, atunci când o încălcare a constrângerilor de integritate pentru întreruperea executării declanșatorului și anularea tuturor modificărilor care au încercat să execute utilizatorul, trebuie să utilizați comanda de tranzacții Rollback.

Pentru a obține o listă de coloane, modificată la efectuarea comenzilor de introducere sau actualizare care au cauzat execuția declanșatorului, puteți utiliza funcția Columns_updated (). Acesta returnează un număr binar, fiecare bit, începând cu cel mai tânăr, corespunde unei coloane de masă (în ordinea coloanelor atunci când creează o masă). Dacă bitul este setat la "1", coloana corespunzătoare a fost modificată. În plus, schimbarea coloanei determină și funcția de actualizare (biblioteca_name).

Pentru declanșarea eliminării Comanda utilizată

Drop Trigger (Nametrigger) [, ... N]

Dăm exemple de utilizare a declanșatorilor.

Exemplul 14.1. Folosind un declanșator pentru implementarea limitărilor. În recordul adăugat la masă, numărul de bunuri vândute vândute nu ar trebui să fie mai puțin decât reziduul său din tabelul de depozitare.

Comanda de intrare din tabelul tranzacției poate fi, de exemplu, astfel:

Introducerea în valorile tranzacției (3.1, -299, "01/08/2002")

Triggerul creat trebuie să răspundă la execuția sa după cum urmează: Este necesar să anulați comanda dacă valoarea mărfurilor a rămas mai mică decât mărfurile vândute cu codul introdus (în exemplul codului produsului \u003d 3). În înregistrarea de inserție, numărul de bunuri este indicat cu semnul "+", dacă mărfurile sunt furnizate și cu semnul "-", dacă este vândut. Triggerul prezentat este configurat să proceseze o singură înregistrare adăugată.

Creați declanșatorul Trigger_ins înal pentru a insera ca și cum @@ Rowcount \u003d 1 începe dacă nu există (selectați * de la inserat în cazul în care-transfabed.4<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Exemplul 14.1. Folosind un declanșator pentru a implementa limitele valorii.

Exemplul 14.2. Folosind un declanșator pentru a colecta date statistice.

Creați un declanșator pentru a procesa o operație de introducere a intrării într-un tabel de tranzacție, de exemplu, o astfel de comandă:

Introduceți în tranzacții de valori (3,1,200, "01/08/2002")

bunuri completate cu codul 3 de la client cu codul 1 în valoare de 200 de unități.

La vânzarea sau obținerea de bunuri, este necesar să se modifice suma stocului său de depozit. Dacă nu există niciun produs în stoc, trebuie să adăugați intrarea corespunzătoare în tabelul de depozit. Trigul procesează doar un șir adăugat.

ALTER TRIGGER TRIGGER_INS PE TRIGGER_INS PE TRANSACTION PENTRU INSERT AS DECLARE @X INT, @ INT IF @@ Rowcount \u003d 1 - În Tabelul Tranzaction adaugă înregistrarea - prin livrarea bunurilor începerea bunurilor vândute trebuie să nu fie - pur și simplu decât echilibrul său Din depozitul de masă dacă nu există (selectați * de la inserat în cazul în care-transserted.Number< =ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "откат товара нет " END --если записи о поставленном товаре еще нет, --добавляется соответствующая запись --в таблицу Склад IF NOT EXISTS (SELECT * FROM Склад С, inserted i WHERE С.КодТовара=i.КодТовара) INSERT INTO Склад (КодТовара,Остаток) ELSE --если запись о товаре уже была в таблице --Склад, то определяется код и количество --товара издобавленной в таблицу Сделка записи BEGIN SELECT @y=i.КодТовара, @x=i.Количество FROM Сделка С, inserted i WHERE С.КодТовара=i.КодТовара --и производится изменения количества товара в --таблице Склад UPDATE Склад SET Остаток=остаток[E-mail protejat] Unde CodTower [E-mail protejat] Sfârșitul sfârșitului. Exemplul 14.2. Folosind un declanșator pentru a colecta date statistice.

Exemplul 14.3. Creați un declanșator pentru procesarea unei operațiuni de ștergere a înregistrării dintr-un tabel de tranzacție, de exemplu, o astfel de comandă:

Pentru produs, codul al cărui cod este specificat la scoaterea înregistrării, este necesar să se ajusteze reziduul în depozit. Trigul procesează doar o singură intrare la distanță.

Creați declanșatorul Trigger_del pe Ștergere ca și cum @@ Rowcount \u003d 1 - Unul începe să declare @y Int, @ x Int - determină codul și numărul de bunuri de la masă din tabel Selectați @ y \u003d codovar, @ x \u003d cantitate de la ștergere - În depozitul de masă ajustează numărul de reziduuri de actualizare a magazinului de actualizare a magazinului \u003d reziduu [E-mail protejat] Unde CodTower [E-mail protejat] Sfârșit. Exemplul 14.3. Trigger pentru procesarea unei îndepărtări a înregistrării de la masă

Exemplul 14.4. Creați un declanșator pentru a procesa operația de schimbare a înregistrării în tabelul de tranzacție, de exemplu, printr-o astfel de comandă:

În toate tranzacțiile cu un produs care are un cod egal cu 3, reduceți cantitatea de bunuri cu 10 unități.

Comanda specificată poate duce la o modificare a mai multor intrări la tabelul de tranzacție. Prin urmare, arătăm cum să creați o procesare a declanșatorului nu o înregistrare. Pentru fiecare înregistrare schimbată, este necesar să se reducă soldul mărfurilor în stoc prin valoarea valorii mărfurilor în stoc și pentru noua (după modificare) a produsului la valoarea produsului și pentru noul ( După schimbare) a codului produsului pentru a-și mări echilibrul în magnitudinea noului (după schimbare). Pentru a gestiona toate înregistrările schimbate, introduceți cursoare în care salvați toate vechiul (din tabelul șters) și toate valorile noi (din tabelul inserat).

Creați declanșator trigger_upd pe tranzacție pentru actualizare ca declarare @x Int, @x_old Int, @y Int, @y_old Intor, cu noi valori ale cursorului Declar Cur1 pentru Select Codovar, Cantitatea de la Cursor inserat - Cursor Cur2 Cursor pentru a declara SELECT CODOVAR, Cantitate din cursul Deschidere Deschidere Cur2 - Deplasare în paralel pe ambele preluare de la curbură în cursoare @x, @y preluta următoare de la cur2 în @x_old, @_old în timp ce @@tch_status \u003d 0 începe - pentru codul vechi produs Reduce - dobândirea sa în stoc Reziduul setat de depozitare a stocului \u003d reziduu [E-mail protejat]în cazul în care Kodtower. [E-mail protejat]_old - Pentru un nou cod de produs, dacă nu există un astfel de produs în stoc, este introdus o înregistrare nouă dacă nu există (selectați * de unde Kodtovar Warehouse [E-mail protejat]) Introduceți în depozit (codovar, reziduuri) (@ x, @ y) altceva pentru un nou cod de produs mărește numărul în stocul de actualizare a reziduului de depozitare \u003d reziduu [E-mail protejat] Unde CodTower [E-mail protejat] FETCH Următorul de la Cur1 în @x, @y Fetch Următorul de la cur2 Inte @x_old, @Y_old sfârșitul închidere cur1 close cur2 dealocați cur1 dealocați curba Exemplul 14.4. Declanșator pentru procesarea modificărilor de înregistrare în tabel

În declanșatorul considerat, nu există comparație a numărului de bunuri atunci când o modificare a înregistrării tranzacției cu reziduul său în depozit.

Exemplul 14.5. Să rezolvăm acest defect. Pentru a genera un mesaj de eroare, utilizați comanda MS SQL Server RaisError din corpul de declanșare, ale căror argumente sunt textul mesajului, nivelul de severitate și starea erorii.

Alter declanșator trigger_upd pe tranzacție pentru actualizare ca declarare @x Int, @x_old Int, @y Int, @ @y_old Int, @ @ @ @y_old Int, @ int declarare cur1 cursor pentru selected codovar, cantitate de la declarare declare cur2 cursor pentru selectarea codovar , Număr din cursul Open Cur2 Deschideți Let de la Cur1 în @x, @y Fetch Următor de la cur2 în @x_old, @_y_old în timp ce @@tch_status \u003d 0 începe să selectați @ O \u003d reziduul de la locul unde Kodtovar [E-mail protejat] Dacă @o.<[E-mail protejat] Începe RaisError ("Transformat", 16.10) CURĂRUL CURĂR1 CUR2 DEALLOCARE CUR1 DEALLOCARE CUR22 ROLLBACK TRAN RETURN Update Walke Set Pale \u003d Rest [E-mail protejat]în cazul în care Kodtower. [E-mail protejat]_old dacă nu există (selectați * din depozitul de grilă Codovar [E-mail protejat]) Introduceți în depozit (Lemn de code, reziduu) (@ x, @ y) Setarea altora Actualizare reziduuri de depozitare \u003d reziduu [E-mail protejat] Unde CodTower [E-mail protejat] FETCH Următorul de la Cur1 în @x, @y Fetch Următorul de la cur2 Inte @x_old, @Y_old sfârșitul închidere cur1 close cur2 dealocați cur1 dealocați curba Exemplul 14.5. Versiunea corectată de declanșare pentru procesarea modificărilor de înregistrare în tabel

Exemplul 14.6. În exemplu, anularea tuturor modificărilor apare dacă este imposibil să se realizeze cel puțin una dintre ele. Creați un declanșator care vă permite să anulați modificarea numai a unor înregistrări și efectuați modificarea restului.

În acest caz, declanșatorul este executat nu după schimbarea înregistrărilor, ci după comanda de schimbare.

Alter declanșator trigger_upd on transfer în loc de actualizare ca declarare @k Int, @k_old int declarare @x Int, @x_old Int, @y Int Declar @y_old int, @ o Int declarare cur1 cursor pentru codurile selectate, kodtovar, cantitatea de la declararea declarațiilor CUR2 cursor pentru codurile selectate, Kodtovar, Cantitatea de la Cur1 Deschidere Cur2 Deschideți Let de la Cur1 în @ K, @ X, @ Fetch Următorul de la cur2 în @ K_old, @ @@tch_status \u003d 0 Începeți selectați @ o \u003d reziduul din Wovel Kodtovar [E-mail protejat] Dacă @o\u003e [E-mail protejat] Începe RaisError ("Schimbați", 16.10) Actualizați setarea tranzacției [E-mail protejat], Codul produsului [E-mail protejat] Wheredelka. [E-mail protejat] Actualizați reziduul setat de depozit \u003d reziduu [E-mail protejat]în cazul în care Kodtower. [E-mail protejat]_old dacă nu există (selectați * din depozitul de grilă Codovar [E-mail protejat]) Introduceți în depozit (Lemn de code, reziduu) (@ x, @ y) Setarea altora Actualizare reziduuri de depozitare \u003d reziduu [E-mail protejat] Unde CodTower [E-mail protejat] Sfârșitul altceva RAISError ("Înregistrarea nu a fost modificată", 16.10) FETCH Următorul de la Cur1 în @ K, @ X, @y Fetch Următorul de la cur2 în @ K_old, @ X_old, @Y_old sfârșitul închidere cur1 închidere cur2 dealocați cur1 dealocați curba Exemplul 14.6. Un declanșator care vă permite să anulați modificarea numai a unor înregistrări și efectuați modificarea restului.

Se aplică:SQL Server (începând în 2008) SQL Azure Pack SQL AzureParlel Baza de date Depozit de date

Creează un declanșator de prelucrare a datelor, DDL sau o intrare. Triggerul este un tip special de procedură stocată automat când apare un eveniment pe serverul de baze de date. Declanșatoarele de prelucrare a datelor sunt conduse de evenimente cauzate de o încercare de utilizator de a modifica datele utilizând un limbaj de procesare a datelor. Evenimentele DML sunt inserarea, actualizarea sau ștergerea procedurilor aplicate la masă sau reprezentare. Aceste declanșatoare sunt declanșate atunci când începeți orice eveniment valabil, indiferent dacă afectează orice rânduri ale tabelului.

DDL declanșatoare sunt declanșate ca răspuns la o serie de limbi de descriere a datelor (DDL). Aceste evenimente respectă în principal TRANSACT-SQL Creare, modificare, instrucțiuni de prindere și unele magazine de sistem care funcționează similare cu operațiile DDL. Declanșatoarele de intrare pot fi declanșate ca răspuns la evenimentul de logare care apare în timpul instalării sesiunilor personalizate. Declanșatoarele pot fi create direct din instrucțiunile sau metodele de ansambluri TRANSACT-SQL create în Microsoft .NET Framework Companii (CLR) și transmisie către o instanță a serverului SQL. Serverul SQL vă permite să creați declanșatoare multiple pentru orice instrucțiune.

SQL Server Syntax - declanșator pe o instrucțiune Insert, Actualizare sau Ștergere într-o masă sau vizualizare (DML Trigger) Creați [sau Alter] declanșator [Schema_name. ] Trigger_name on (tabel | vizualizare) [CU [, ... N]] (Pentru | după | în loc de) ([inserați] [,] [Update] [,] [Ștergere]) [cu APPLAD] [Nu pentru replicare] ca (sql_statement [, ... N] | Numele extern } :: \u003d [criptare] [Execute ca clauză] :: \u003d ansamblu_name.class_name.method_name.

SQL Server Syntax - declanșator pe o instrucțiune de introducere, actualizare sau ștergere la o masă (tabele DML) Creați [sau Alter] declanșator [Schema_name. ] Trigger_name pe (tabel) [cu [, ... N]] (pentru | după) ([inserați] [,] [actualizare] [,] [Ștergere]) ca (sql_statement [;] [, ... N]) :: \u003d [Native_Compilation] [Schemabinding] [Execute ca clauza]

Declanșator pe creare, modificare, drop, grant, deny, revocare sau actualizare (declanșator DDL) Creați [sau alter] declanșator Trigger_name on (toate serverul | Baza de date) [cu [, ...] (pentru | după) (Event_Type | Event_Group) [, ... N] ca (sql_statement [;] [, ... N] | Numele extern< method specifier > [ ; ] }

Declanșator pe un eveniment de conectare (logon declanșator) creați [sau alter] declanșator trigger_name pe toate serverul [cu [, ... N]] (pentru | după) Logon ca (sql_statement [;] [, ... N] | Numele extern< method specifier > [ ; ] } :: \u003d [criptare] [Execute ca clauză]

Windows Azure SQL Baza de date Sintaxă - declanșator pe o instrucțiune Insert, Update sau delet la o masă sau vedere (DML Trigger) Creați [sau Alter] declanșator [Schema_name. ] Trigger_name on (tabel | vizualizare) [cu [, ...]] (pentru | după | în loc de) ([inserați] [,] [actualizare] [,] [Ștergere]) ca (sql_statement [;] [, ... n] [;]\u003e ) :: \u003d [Execute ca clauza]

Windows Azure SQL Baza de date sintaxă - declanșator pe Creare, Alter, Drop, Grant, Declarația Statistici (DDL Trigger) Creați [sau Alter] Trigger Trigger_name on (Baza de date) [cu [, ...]] (pentru | după) (Event_Type | Event_Group) [, ... N] ca (sql_statement [;] [, ... N] [;]) :: \u003d [Execute ca clauza]

Conditifly modifică declanșatorul numai dacă există deja.

schema_name.
Numele diagramei aparține declanșatorului DML. Acțiunea de declanșare DML este limitată la zona de masă a tabelului sau reprezentării pentru care sunt create. schema_name. Nu pot fi specificate pentru declanșatoarele sau intrările DDL.

name_trigger.
Numele declanșatorului. Un obiect name_trigger. trebuie să respecte regulile pentru, cu excepția faptului că name_trigger. Nu se poate începe cu caracterele # sau ##.

masa | vEDERE.
O masă sau o reprezentare în care este efectuată declanșatorul DML, uneori indicat ca o masă de declanșare sau o reprezentare de declanșare. Notă Numele sau depunerea tabelului specificat nu este obligatorie. Numai în loc de declanșare se poate referi la prezentare. DML declanșatoare nu pot fi descrise în mese temporare locale sau globale.

Bază de date
Aplică DDL Trigger de aplicare la baza de date curentă. Dacă este specificat, declanșatorul funcționează ori de câte ori tip de eveniment. sau event_Group apare în baza de date curentă.

Aplică un domeniu de declanșare DDL sau un declanșator de intrare la serverul curent. Dacă este specificat, declanșatorul funcționează ori de câte ori tip de eveniment. sau event_Group Există vreun loc pe serverul curent oriunde.

Întunecați textul instrucțiunii Creare declanșator. Utilizarea parametrului cu criptare nu vă permite să publicați un declanșator ca parte a replicării serverului SQL. Parametrul cu criptare nu poate fi specificat pentru declanșatoarele CLR.

Executați ca.
Specifică contextul de securitate în care este efectuat declanșatorul. Vă permite să gestionați contul de utilizator utilizat de instanța SQL Server pentru a verifica permisiunea oricăror obiecte de bază de date referitoare la declanșator.

Pentru mai multe informații, consultați secțiunea.

Native_compilation.
Indică faptul că declanșatorul este compilat în propriul cod.

Acest parametru este obligatoriu pentru declanșatoarele în tabelele optimizate pentru memorie.

Schembinding.
Se asigură că tabelele menționate de declanșator nu pot fi îndepărtate sau modificate.

Acest parametru este obligatoriu pentru declanșatoarele în tabelele optimizate pentru memorie și nu este acceptată pentru declanșatoare în tabele convenționale.

Pentru |. După
Dupatul de tip indică faptul că declanșatorul DML este declanșat numai după executarea cu succes a tuturor operațiunilor din instrucțiunea SQL, lansată de un declanșator. Toate acțiunile și verificările cascadei pentru limitările pe care există o legătură trebuie să fie finalizată cu succes înainte ca declanșatorul să funcționeze.

Dacă este cazul singurul cuvânt cheie specificat, argumentul după-amiază este utilizat în mod implicit.

După declanșatoare nu pot fi definite pe idei.

In loc de.
Indică faptul că declanșatorul DML este efectuat in schimb Rularea declarației SQL, prin urmare, suprascrie acțiunea instrucțiunilor de pornire. În loc de argument nu poate fi specificat pentru declanșatoarele DDL sau declanșatoarele de intrare.

Pentru fiecare inserare, actualizare sau ștergere instrucțiune în tabel sau vedere, nu mai mult de un declanșator în loc de pot fi determinate. Cu toate acestea, este posibil să se determine vederile privind punctele de vedere în care fiecare vizualizare are propriul său decr în loc de.

Utilizarea în loc de declanșatoare nu este permisă în susținerea observațiilor care utilizează parametrul opțiunii de verificare. Serverul SQL provoacă o eroare dacă în loc de declanșare este adăugată la suportul de susținere cu parametrul Opțiune de verificare. Utilizatorul trebuie să ștergă acest parametru utilizând instrucțiunea ALTER Vizualizare înainte de a determina atenția lui Triggeg.

([DELETE] [,] [INSERT] [,] [actualizare])
Definește instrucțiunile de modificare a datelor pentru care declanșatorul DML este declanșat dacă este aplicat la masă sau reprezentare. Trebuie să specificați cel puțin o instrucțiune. În definiția declanșatorului, oricare dintre combinațiile lor în orice ordine este permisă.

Pentru în loc de parametrul de ștergere nu este permis în tabelele având o conexiune de referință cu o acțiune în cascadă pe Ștergere. În mod similar, parametrul de actualizare nu este permis în tabele care au o conexiune de referință cu o acțiune în cascadă la actualizare.

Indică faptul că este necesar un declanșator de tip existent. Argumentul APPLAD nu poate fi utilizat pentru declanșatoare sau cu specificarea explicită a declanșatorului de afterte. Argumentul APPLAD poate fi utilizat numai la specificarea parametrului pentru sau după sau după motive de susținere a compatibilității înapoi. Argumentul cu APPLAD nu poate fi specificat dacă este specificat parametrul de nume extern (în cazul unui declanșator CLR).

tip de eveniment.
Numele evenimentului Language Transact-SQL, care după execuție determină declanșatorul DDL declanșator. Evenimente valide pentru declanșatoarele DDL sunt enumerate în.

event_Group
Numele grupului standard de evenimente TRANSACT-SQL. DDL declanșatorul este declanșat după efectuarea oricăror evenimente de limbă tranzacția-SQL la care aparține event_Group. Lista grupurilor de evenimente pentru declanșatoarele DDL sunt enumerate în.

După finalizarea lucrării, instrucțiunile de declanșare Creare event_Group Funcționează, de asemenea, ca macro, adăugând evenimentele tipurilor corespunzătoare la vizualizarea directorului sys.trigger_events.

Nu pentru replicare

Indică faptul că declanșatorul nu poate fi executat dacă agentul de replicare modifică tabelul utilizat de declanșator.

sql_statement.
Condițiile și acțiunile declanșatorului. Condițiile de declanșare indică criterii suplimentare care determină evenimente - DML, DDL sau eveniment de intrare - cauza declanșatorului declanșator.

Acțiunile declanșatorului specificate în instrucțiunile de limbă TRANSACT-SQL intră în vigoare după încercarea de a utiliza operația.

Declanșatoarele pot conține orice număr de limbi TRANSACT-SQL de orice tip, pentru unele excepții. Pentru mai multe informații, consultați subsecțiunea "Note". Declanșatoarele sunt concepute pentru a controla sau schimba datele pe baza instrucțiunilor de modificare sau definiție a datelor; Ele nu returnează niciun fel de date utilizatorului. Transact-SQL conține adesea instrucțiuni în declanșator limba de control al fluxului.

DML declanșatoare utilizează tabele logice (conceptuale) șterse și inserate. Prin structura sa, acestea sunt similare cu tabelul pe care este definit un declanșator, adică tabelul la care se aplică acțiunea utilizatorului. Tabelele șterse și inserate conțin valori vechi sau noi de rânduri care pot fi modificate de acțiunile utilizatorilor. De exemplu, puteți utiliza instrucțiunile pentru a solicita toate valorile tabelului șters:

Selectați * de la șters;

Pentru mai multe informații, consultați secțiunea.

DDL declanșează și colectarea de informații despre informații despre evenimente care rulează folosind funcția. Pentru mai multe informații, consultați secțiunea.

SQL Serverells Update text, ntext., sau imagine Coloana declanșează cu ajutorul pentru tabele sau reprezentări.

Pentru declanșatoarele în tabele optimizate pentru unic sql_statement. Permis la nivelul superior al unității atomice. Este permisă în interiorul blocului atomic T-SQL, este limitat la procedura proprie a T-SQL.

< method_specifier >

Indică metoda de asamblare pentru legarea la CLR-declanșator. Această metodă nu ar trebui să primească argumente și să returneze valorile VOID. numele clasei. Trebuie să fie un identificator SQL SQL valid și există ca o clasă în ansamblul de asamblare. Dacă clasa are un nume care conține puncte (.) Pentru a separa componentele spațiului de nume, numele clasei trebuie să fie închis în paranteze pătrate () sau citate dublu (""). Clasa nu poate fi încorporată.

DML declanșatoare sunt adesea folosite pentru a aplica regulile de afaceri și integritatea datelor. SQL Server Declarația de referință Restricționarea integrității este asigurată de tabelul Alter și creează instrucțiuni de tabel. Cu toate acestea, limitarea declarativă a integrității de referință nu oferă integritatea de referință între baze de date. Limitarea integrității de referință implică executarea regulilor de comunicare între cheile primare și cele externe ale tabelelor. Pentru a permite restricțiile de integritate de referință, utilizați cheia primară și cheia FORGN în tabelul Alter și creați tabelul de masă. Dacă restricțiile se aplică tabelului de declanșare, ele sunt verificate după declanșarea graficului de declanșare și înainte de a executa declanșatorul după după. În caz de încălcare a restricției, acțiunile declanșatorului în loc de, iar după declanșarea după care nu funcționează.

Primul și ultimul după declanșatoare, care vor fi efectuate în tabel, pot fi definite utilizând procedura SP_SETTRIGGERDEROrder. Pentru o masă, puteți defini un singur și un ultim declanșator pentru fiecare dintre operațiile de introducere, actualizare și ștergere. Dacă există alte după declanșatoarele din tabel, acestea vor fi efectuate la întâmplare.

Dacă manualul de declanșare alter modifică primul sau ultimul declanșator, primul sau ultimul set de atribute ale declanșatorului modificat este șters, iar ordinea de sortare trebuie să fie setată la procedura SP_SETTRIGGERDERderder.

Dupa declanșatorul se efectuează numai după ce declanșatorul care apelează instrucțiunea SQL a fost finalizată cu succes. Implementarea cu succes implică, de asemenea, finalizarea tuturor acțiunilor cascadă de referință și verificarea restricțiilor legate de obiectele modificate sau la distanță. Dupa declanșatorul nu provoacă declanșarea conspirată de declanșare în loc de aceeași masă.

Dacă în loc de în loc de a fi definit pentru tabelul efectuează în raport cu masa orice instrucțiune care din nou a provocat răspunsul de declanșare în loc de, declanșatorul nu este numit recursiv. În schimb, instrucțiunea este procesată ca și cum tabelul nu a avut nici o configurație a locului în loc, iar secvența de restricții începe și execută declanșatorul după afți. De exemplu, dacă un declanșator este definit ca un declanșator de inserție pentru o masă și execută instrucțiunile de inserare pentru aceeași masă, instrucțiunea de inserție nu provoacă o operație nouă de declanșare. Comanda de inserție efectuată de declanșator începe procesul de aplicare a restricțiilor și a platformei tuturor declanșatorilor de inserție definit pentru acest tabel.

În cazul în care în loc de în loc de a fi definit pentru prezentare efectuează cu privire la vizionarea oricărei instrucțiuni pe care declanșatorul în loc de ONA le răspunde din nou, declanșatorul nu este numit recursiv. În schimb, instrucțiunea face o schimbare în tabelele de bază pe care se bazează vederea. În acest caz, definiția ar trebui să satisfacă toate restricțiile stabilite pentru reprezentările actualizate. Definiția vizualizărilor actualizate, consultați secțiunea.

De exemplu, dacă declanșatorul este definit ca un loc de actualizare pentru a reprezenta și execută instrucțiunea de actualizare pentru aceeași vizualizare, instrucțiunea de actualizare executată de declanșator nu provoacă o operație nouă de declanșare. Instrucțiunea de actualizare efectuată în procesul de declanșare procesează ideea ca și cum prezentarea nu avea în loc de declanșator. Coloanele, modificate utilizând instrucțiunea de actualizare, ar trebui să aparțină unei tabele de bază. Fiecare modificare a tabelului de bază determină utilizarea unei secvențe de restricții și plutonul răspunsului după definit pentru acest tabel.

Verificați actualizarea acțiunilor sau introduceți instrucțiunile privind coloanele specificate

Transact-SQL Trigger poate fi construit pentru a efectua acțiuni specifice bazate pe schimbarea anumitor coloane utilizând instrucțiuni de actualizare sau introducere. Utilizați sau în corpul de declanșare în acest scop. Designul actualizare () verifică instrucțiunile de actualizare sau inserare pe o singură coloană. Folosind designul de columns_update, instrucțiunile de actualizare sau de inserare, efectuate pe mai multe coloane, sunt verificate și un șablon de biți este returnat, indicând ce coloane sunt inserate sau actualizate.

Declanșează restricții

Instrucțiunea Creare declanșator ar trebui să fie prima instrucțiune din pachet și poate fi aplicată numai la un tabel.

Triggerul este creat numai în baza de date curentă, dar poate, cu toate acestea, să conțină referințe la obiectele din afara bazei de date curente.

Dacă numele diagramei este specificat pentru a rafina declanșatorul, numele tabelului trebuie clarificat în același mod.

Aceeași acțiune de declanșare poate fi definită de mai mult de o acțiune de utilizator (de exemplu, introduceți și actualizați) în aceeași instrucțiune de declanșare creează.

În loc de ștergere / actualizare, declanșatoarele nu pot fi definite pentru un tabel care are o cheie externă definită pentru o execuție cascadă a operațiunii Ștergere / actualizare.

În interiorul triggerului, poate fi utilizată orice instrucțiune de setare. Parametrul setat selectat rămâne în vigoare în timpul executării declanșatorului, după care setările sunt returnate în starea anterioară.

În timpul declanșatorului de declanșare, rezultatele sunt returnate de aplicația apelantă, precum și în cazul procedurilor stocate. Pentru a preveni declanșarea rezultată a declanșatorului, returnarea rezultatelor retur nu trebuie să includă instrucțiunile de selectare care returnează rezultatul sau instrucțiunile care sunt efectuate în atribuirea declanșatorului variabilelor. Declanșator care conține fie instrucțiuni de selectare care returnează rezultatele la utilizatorul sau instrucțiunile care atribuie variabile necesită o circulație specială; Aceste rezultate returnate trebuie să fie suprascrise în toate aplicațiile în care sunt permise modificările tabelului de declanșare. Dacă o sarcină variabilă în declanșator, ar trebui să utilizați declarația SET NONTOUNT la începutul declanșatorului pentru a preveni seturi de rezultate.

Deși instruirea tabelului trunchiat este în esența sa, este instrucțiunea de ștergere, nu activează declanșatorul, deoarece operația nu înregistrează eliminarea liniilor individuale. Cu toate acestea, este necesar să vă faceți griji cu privire la ruperea aleatorie a declanșatorului de ștergere în acest fel numai utilizatorii cu permisiuni pentru executarea instruirii tabelului trunchiat.

Instrucțiuni SHITTEXT (cu înregistrarea și fără ea) nu începe declanșatoarele.

Următoarele instrucțiuni de limbă Transact-SQL nu sunt permise în declanșatoarele DML:

DDL declanșatoare, precum și declanșatoare standard, efectuează proceduri stocate ca răspuns la orice eveniment. Spre deosebire de declanșatoarele standard, ele nu sunt declanșate ca răspuns la execuția actualizării, introducerea sau ștergerea instrucțiunilor în raport cu tabelul sau reprezentarea. În schimb, declanșatoarele sunt declanșate mai întâi ca răspuns la instrucțiunile de limbă de definiție a datelor (DDL). Acestea sunt instrucțiuni creează, modifică, renunța, acorda, deny, revoca și actualiza statistici. Procedurile stocate de sistem care efectuează operațiuni, cum ar fi operațiile DDL, pot rula, de asemenea, declanșatoare DDL.

Pentru mai multe informații despre declanșatoarele DDL, consultați secțiunea.

DDL declanșatoare nu sunt declanșate ca răspuns la evenimentele care afectează mesele temporare locale sau globale și procedurile stocate.

Spre deosebire de declanșatoarele DML, declanșatoarele DDL nu se limitează la zona schemei. Prin urmare, pentru a solicita metadate despre declanșatoarele DDL, nu puteți utiliza astfel de funcții ca obiect_id, obiect_name, obiectproperty și obiectivpropertyex. Utilizați în schimb prezentarea directorului. Pentru mai multe informații, consultați secțiunea.

Declanșatoarele de intrare efectuează proceduri stocate ca răspuns la evenimentul de conectare. Acest eveniment este apelat la instalarea unei sesiuni personalizate cu o instanță SQL Server. Declanșatoarele de intrare sunt declanșate după finalizarea fazei de autentificare atunci când se conectează, dar înainte de sesiunea de utilizator este de fapt stabilită. În consecință, toate mesajele care apar în declanșator ajung, de obicei, la utilizator, cum ar fi mesajele de eroare și mesajele din instrucțiunea de imprimare, sunt redirecționate în jurnalul de eroare SQL Server. Pentru mai multe informații, consultați secțiunea.

Dacă autentificarea nu reușește, declanșatoarele de intrare nu sunt declanșate.

Declanșatoarele de intrare nu sunt acceptate tranzacții distribuite. Dacă declanșatorul de intrare este declanșat, conținând o tranzacție distribuită, o eroare 3969 este returnată.

Oprirea declanșatorului de intrare

Triggerul de intrare poate dezactiva în mod eficient conexiunile la componenta motorului bazei de date pentru toți utilizatorii, inclusiv membrii rolului serverului predefinit. sysadmin. . Dacă declanșatorul de intrare interzice conexiunile, membrii rolului serverului predefinit sysadmin. Poate fi conectat utilizând o conexiune administrativă selectată sau prin apelarea componentei motorului bazei de date în modul de configurare minim (-F). Pentru mai multe informații, consultați secțiunea.

Returnați rezultatele

Abilitatea de a returna rezultatele de la declanșatoare va fi exclusă din următoarea versiune a SQL Server. Declanșatoare Returnarea seturilor rezultate pot duce la un comportament neașteptat al aplicațiilor care nu sunt destinate să lucreze cu acestea. Nu utilizați declanșatoare în aplicații dezvoltate care returnează seturi de rezultate și programați modificarea aplicațiilor care le utilizează în prezent. Pentru declanșatoare pentru a returna seturile rezultate, setați valoarea 1.

Declanșatoarele de intrare interzic întotdeauna rambursarea seturilor rezultate, iar acest comportament nu poate fi configurat. Dacă declanșatorul de intrare generează un set rezultat, atunci declanșatorul nu este efectuat și încercarea de intrare cauzată de declanșator este interzisă.

Câteva declanșatoare

Serverul SQL vă permite să creați declanșatoare multiple pentru fiecare eveniment DML, DDL și LOGON. De exemplu, dacă manualul de declanșare pentru actualizare este efectuat într-un tabel care are deja un declanșator de actualizare, este creat suplimentar un declanșator de actualizare. În versiunile anterioare ale serverului SQL, doar un singur declanșator a fost permis în fiecare tabel pentru fiecare inserție, actualizare sau ștergere a evenimentului de schimbare a datelor.

Declanșatoare recursive

Serverul SQL permite apelul recursiv, dacă se utilizează instrucțiunea de bază alternativă, setarea recursivă_triggers este activată.

Următoarele tipuri de recursuri pot apărea în declanșatoarele recursive:

    Recursionarea indirectă

    Cu o recursiune indirectă, aplicația actualizează tabelul T1. Acest eveniment cauzează declanșatorul triggerului TR.1, care actualizează tabelul T2. Acest lucru cauzează declanșarea declanșatorului T2 și actualizarea tabelului T1.

    RECURȚIONAREA DIRECTELOR

    Cu recursion direct, aplicația actualizează tabelul T1. Acest eveniment cauzează răspunsul TRI1 declanșator care actualizează tabelul T1. Deoarece tabelul T1 a fost deja actualizat, triggerul trigs din nou și așa mai departe.

Următorul exemplu utilizează ambele tipuri de recursuri: drept și indirect. Să presupunem că tabelul T1 definește două declanșare: TR1 și TR2. TRIGGER TR1 actualizează recursiv tabelul T1. Instrucțiunea de actualizare efectuează fiecare dintre declanșatoarele TR1 și TR2 o dată. În plus, declanșatorul declanșator declanșator trigger tri1 (recursiv) și tr2. Tabelele de declanșare introduse și șterse conțin linii care se aplică numai instrucțiunilor de actualizare care au cauzat declanșatorul declanșatorului.

Dezactivați setările recursive_triggers previne numai recursionarea directă. Pentru a dezactiva recursiunea indirectă, utilizând procedura stocată SP_Configurare, atribuiți serverului de declanșare imbricați la 0.

Dacă unul dintre declanșatoare efectuează instrucțiunea de tranzacție de răsturnare, nu sunt declanșate alte declanșatoare, indiferent de nivelul de cuibărit.

Declanșatoare imbricate

Cuibul de declanșare poate ajunge la un nivel maxim 32. Dacă declanșatorul modifică tabelul pentru care este definit un alt declanșator, atunci cel de-al doilea declanșator este lansat, ceea ce determină declanșatorul celui de-al treilea etc. Dacă oricare dintre declanșatoarele din lanț se oprește ciclul infinit, nivelul de cuibărit depășește limita admisă, iar răspunsul de declanșare este anulat. Dacă triggerul TRANSACT-SQL efectuează un cod controlat utilizând o referință la metoda, tipul sau funcția statistică a mediului CLR, această legătură este considerată una dintre nivelurile admise de 32 de cuibărire. Metodele cauzate de un cod gestionat nu sunt supuse acestei restricții.

Pentru a anula declanșatoarele imbricate, setați valoarea 0 Parametrul de declanșare Tripgers SP_CONFIGURE PROCEDURA. În configurația implicită, declanșatoarele imbricate sunt permise. Dacă declanșatoarele atașate sunt dezactivate, declanșatoarele recursive vor fi, de asemenea, dezactivate, indiferent de setarea recursive_triggers instalată utilizând instrucțiunea de baze de date Alter.

Primul după declanșare încorporată în loc de, declanșatorul este declanșat, chiar dacă declanșatoare imbricate Parametrul de configurare a serverului este setat la 0. Cu toate acestea, cu această valoare a parametrilor, declanșatoarele ulterioare nu sunt declanșate. Se recomandă verificarea aplicațiilor pentru declanșatoarele imbricate pentru a determina dacă aplicațiile îndeplinesc regulile de afaceri acest comportament declanșatoare imbricate Parametrul de configurare a serverului este 0 și efectuați modificări corespunzătoare.

Interpretarea întârziată a numelor

Serverul SQL a servit proceduri stocate, declanșatoare și pachete în limba TRANSACT-SQL, care conțin referințe la tabele care nu există în momentul compilării. O astfel de oportunitate se numește interpretare a numelui amânată.

Pentru a crea un declanșator DML necesită modificarea permisiunii la o masă sau o reprezentare în care este creat un declanșator.

Pentru a crea un declanșator DDL cu o zonă de acțiune în cadrul serverului (pe toate server) sau declanșatorul de conectare necesită permisiunea serverului de control către server. Pentru a crea un declanșator DDL cu o zonă de vizibilitate într-o bază de date (pe baza de date), este necesară modificarea oricărui permisiune de declanșare a bazei de date DDL pentru baza de date curentă.

A. Utilizarea unui declanșator DML cu un mesaj de avertizare

Următorul declanșator DML trimite clientului un mesaj când cineva încearcă să adauge sau să modifice datele din tabelul Clienți din baza de date AventureWorks2012.

Creați memento de declanșare1 pe vânzări.Customer după introducere, actualizare ca RAISERROR ("Notificați relațiile cu clienții", 16, 10); Merge.

B. Utilizarea unui declanșator DML cu un mesaj de avertizare trimis prin e-mail

În exemplul următor, utilizatorul specificat (Marym) prin e-mail mesajul este trimis atunci când tabela de clienți se modifică.

Creați memento de declanșare2 pe vânzări.Customer după introducere, actualizare, ștergere ca exec msdb.dbo.sp_send_dbmail @Profile_name \u003d "AdventureWorks2012 Administrator", @Recipients \u003d " [E-mail protejat]", @body \u003d "Nu uitați să imprimați un raport pentru forța de vânzări"., @subject \u003d "Memento"; Merge.

B. Folosind DML după declanșator pentru regulile de afaceri forțate între mesele de cumpărare AorheaderHeader și furnizor

Deoarece restricția de verificare poate conține referințe numai la coloanele pentru care sunt definite limitările la nivelul coloanei sau tabelul, orice intersabilitate (în acest caz, regula de afaceri) trebuie specificate sub formă de declanșatoare.

Următorul exemplu creează un declanșator DML în baza de date a aventuriiWorkWorks. Acest declanșator efectuează verificarea bonității furnizorului este bună (nu 5) atunci când încercați să introduceți o nouă comandă de achiziție în tabelul de achiziție. Pentru informații despre bonitatea furnizorului, este necesară o legătură către tabelul vânzătorului. În cazul bonității prea scăzute, este afișat mesajul corespunzător, iar inserția nu este efectuată.

Acest declanșator împiedică introducerea unui rând în tabelul de cumpărare.purchaseorderheader - Când ratingul de credit al vânzătorului specificat este setat la 5 (sub medie). Creați instrucțiuni de cumpărare de declanșare.lowcredit pe cumpărare.purchaseorderheader după introducere ca și cum există (selectați * de la cumpărare.purchaseorderheader ca P .purchasedorid \u003d i .purchasedorid Alăturați-vă cumpărați v.creditering \u003d 5) începe raisterrror ( Evaluarea creditului "Un furnizor" este scăzut pentru a accepta noi comenzi de cumpărare "., 16 , 1 ); Tranzacție de răsturnare; Întoarcere. Sfârșit; Merge. - Această declarație încearcă să introducă un rând în tabelul de cumpărături - Pentru un furnizor care are un rating de credit sub medie. - Dispozitivul de declanșare după introducere este concediat și tranzacția de inserție este laminată înapoi înapoi. Introduceți în achiziții.purchaseorderheader (Valori de revizie, status, status, angajat, vendorid, navetehodid, orizor, nave, subtotal, taxamd, de marfă) (2, 3, 261, 1652, 4, getdate (), getdate (), 44594,55, 3567.564, 1114.8638); Merge.

Utilizarea declanșatorului DDL DDL

În exemplul următor, declanșatorul DDL este utilizat pentru a preveni sinonimele pentru baza de date.

Creați siguranța declanșatorului pe baza de date pentru drop_synonym ca RAISERROR ( "Trebuie să dezactivați declanșatorul" Siguranța "pentru a scăpa sinonime!", 10, 1) ROLLBACK GO drop declanșator de siguranță în baza de date; Merge.

D. Utilizarea triggerului DDL Server

În exemplul următor, declanșatorul DDL este utilizat pentru a afișa un mesaj când apare pe această instanță a unui server din evenimentul Creare Baza de date, iar funcția EventData este utilizată pentru a obține textul instrucțiunii corespunzătoare din TRANSACT-SQL. Exemple suplimentare de utilizare a funcției EventData în declanșatoarele DDL văd.

Creați Trigger DDL_TRIG_DATABASE pe toate serverul pentru creat_database ca imprimare "creată". Selectați valoarea EventData () ( "(/ Eveniment_insance / tsqlcommand / comandaxt)", "NVARCHAR (MAX)") Go Drop Trigger DDL_TRIG_DATABASE pe toate serverul; Merge.

E. Folosind declanșatorul de intrare

În exemplul următor, declanșatorul de intrare interzice încercările de a intra în SQL Server Membru lOGIN_TEST. Introduceți dacă există deja trei sesiuni de utilizator în cadrul acestui cont.

Utilizați masterat; Merge. Creați LOGIN LOGIN_TEST cu parola \u003d "3khj6dhx (0xvysdf" mustul_change, check_expiration \u003d on; Merge. Grant View Server State la login_test; Merge. Creați Trigger Conneck_limit_trigger pe toate serverul cu Executare ca "login_test" pentru conectare ca început dacă originalul_login () \u003d "login_test" și (selectați numărul (*) de la sys .dm_exec_sesions unde este_user_process \u003d 1 și original_login_name \u003d "login_test")\u003e