declanșează Programare

După această lecție, veți:

să creeze declanșatori care implementează logica de afaceri în baza de date;

utilizați un pseudo Introdus și șterse;

Utilizați funcțiile normale ale sistemului în declanșatoare.

Durata estimată de lecție - aproximativ 40 de minute.

Când ardere evenimente de declanșare pe INSERT, UPDATE sau DELETE creează un pseudo-unul sau mai multe (de asemenea, cunoscut sub numele de tabel logic). Putem considera tabel ca jurnalele de o tranzacție logică pentru evenimente. Există două tipuri de tabele logice: S-au introdus și șterse. S-au introdus creat ca urmare a evenimentelor de adiție sau de actualizare. Acesta este un set de înregistrări adăugate sau modificate.

UPDATE-declanșare creează un tabel logic șters. Acesta este setul inițial de înregistrări în aceeași stare în care a fost înainte de operația de actualizare. Următorul exemplu creează un declanșator, care afișează conținutul și șterse după eveniment S-au introdus UPDATE autori în tabel:

CREATE TRIGGER dbo.updatetables

SELECT „Descriere“ = Tabelul Introdus: '

SELECT * FROM inserat

SELECT „Descriere“ = „Tabelul Șters:“

SELECT * FROM șters

Tabelul Introdus:

Drept Denby Oakland CA 94009

Tabelul de șters:

Drept Dean Oakland CA 94B09

După executarea actualizare de declanșare Autori tabel (tabel de declanșare) oferă o înregistrare de actualizare. Atunci când a declanșat, declanșatorul poate rula înapoi modificările din tabel Autori. dacă acțiunile adecvate sunt programate în declanșator. Restabiliți tranzacția, de asemenea, prevede pentru inserare și ștergere declanșează.

Atunci când a declanșat, de declanșare pentru a elimina un set de înregistrări șterse plasate într-un tabel logic șters. tabel Inserat nu participă la eveniment DELETE.

Notă: În exemplul anterior, instrucțiunea SELECT este folosită doar pentru motive ilustrative. Nu utilizați niciodată în operatorii declanșatoare care returnează un rezultat dacă nu sunteți sigur ce rezultatul va fi procesat de către aplicația care a cauzat de declanșare la foc.

Acum, că ați învățat scopul de flip-flops, și sa întâlnit cu o varietate de tipuri, vom descrie situațiile de sintaxă pentru crearea și modificarea declanșatoare. Funcții și comenzi ale sistemului extind declanșatoarele pot permite să descrie logica de afaceri în ele.

Construcții UPDATE (ColumnName) și (COLUMNS_UPDATED ())

Structura de jos - UPDATE (imya_spgolbtsa) și (COLUMNS_UPDATED ()) - sunt operatori de componente importante CREATE TRIGGER și ALTER TRIGGER. Aceste construcții sunt lăsate să includă în INSERT și-Update declanșatoare, și pot fi localizate oriunde în instrucțiunea CREATE TRIGGER sau ALTER declanșatoare.

Design IF UPDATE (COLUMN_NAME) determină dacă evenimentul coloană column_name INSERT sau UPDATE. Dacă doriți să specificați mai mult de o coloană, ar trebui să împartă lor UPDATE modele (COLUMN_NAME). De exemplu, următoarele verificări fragment de cod, dacă adăugarea sau actualizarea efectuate în coloane și FIRST_NAME LAST_NAME. și efectuează o acțiune pe aceste coloane ca urmare a unor evenimente sau UPDATE INSERT:

IF UPDATE (first_name) OR UPDATE (LAST_NAME)

-- Dacă oricare dintre coloane este actualizat.

-- rula peste el orice acțiune.

Rezoluția permite numele Deferred absența tabel coloana, numele de coloană specificat în parametrul. la momentul legării pentru a declanșa masă. Cu toate acestea, este necesar ca această coloană a existat la momentul de declanșare. Pentru mai multe informații despre rezoluția de nume amânat descrise în tlave 8.

Dacă înlocuim valoarea în locul numelui coloanei. Clauza UPDATE se va întoarce TRUE. Design (COLUMNS_UPDATED ()) verifică, de asemenea, dacă coloana a fost actualizată. In schimb, structura adevărat sau fals (COLUMNS_UPDATED ()) returnează o mască de tip VARBINARY biți. descrie coloanele în care au efectuat adăugarea sau actualizarea.

Scrie un design (COLUMNS_UPDATED ()) mai greu decât UPDATE (COLUMN_NAME), dar vă permite să se determine exact care dintre coloanele adăugate sau actualizate date testate. coloane verificabili este setat cu o mască care reprezintă numărul (secvența) a fiecărei coloane din tabel. Într-un tabel în aval prezintă primele opt coloane și masca lor atribuite.

Codul de mai jos va permite să verifice dacă datele au fost adăugate sau actualizate în coloanele 4 și 6:

IF (COIUMNS_ U PDATEDO 40)> 0

Valoarea 40 - este rezultatul sumãrii masca 8 la coloana 4 și masca 32 la coloana 6. verifică Expression dacă valoarea (COLUMNS_UPDATED ()) este mai mare decât 0. Cu alte cuvinte, condiția este îndeplinită în cazul în care cel puțin una sau ambele coloanei sunt actualizate. Dacă specificați starea (COLUMNS_UPDATED () 40) = 40, verificarea actualizare se realizează în ambele coloane. Dacă actualizarea a avut loc în doar una dintre coloane, nu sunt îndeplinite condițiile.

Pentru a testa cele nouă sau mai multe coloane, folosește funcția subșir, care vă permite să specificați o mască de declanșare pentru a fi inspectate. De exemplu, următorul cod pentru a verifica dacă coloana nouă este actualizat:

IF ((subșir (COLUMNS_UPDATED (), 2,1) = 1))

Funcția subșir determină structura (COLUMNS_UPDATED ()> du-te la a doua octetul a coloanei și verificați dacă prima coloană a doua octetului (numărul lui de secvență reală este 9) a fost actualizată. Pentru această coloană returnează o valoare de tip VARBINARY. egal cu 1. În tabelele de mai jos? Ilustrează principiul acțiuni ale funcției substringul necesare pentru a verifica dacă coloanele 9, prin 16.

IF ((subșir (COLUMNS_UPDATED (), 2, y) = z))

Pentru a verifica câteva coloane pe modificarea obiectului, pur și simplu adăugați în sus masca de biți pentru fiecare dintre ele. De exemplu, pentru a verifica coloanele 14 și 16, trebuie setat z expresie 160 (128 + 32).

Funcții și comenzi ale sistemului

Pentru a pune în aplicare logica de afaceri în declanșatoare sunt diferite funcții și comenzi ale sistemului. Declanșatorul este adesea folosit funcția @@ ROWCOUNT. Se returnează numărul de rânduri care sunt afectate de punerea în aplicare a operatorului anterior Transact-SQL. INSERT focuri de declanșare la eveniment, UPDATE sau DELETE, chiar dacă aceasta nu se schimba nici un rând. Prin urmare, pentru ieșirea bistabilului în absența modificării tabelului este comanda sistemului RETURN.

Dacă o eroare este uneori necesară pentru a afișa un mesaj care descrie cauzele sale. Pentru a afișa mesaje de eroare utilizând RAISERROR de comandă a sistemului. mesaje de eroare personalizate create cu sistem stocate mesajele de ieșire procedura sp_addmessage sau încorporate în comanda RAISERROR sistem de apel. Pentru mai multe informații despre sistemul stocate procedura sp_addmessage de contact SQL Server Books Online. În declanșatoare, scrise într-un limbaj Transact-SQL, este, de asemenea, comanda sistem ROLLBACK TRANSACTION folosit uneori. Aceasta determină o revenire a tuturor pachetului de declanșare. Atunci când o eroare fatală deoarece există o derulare înapoi, dar implicit. În cazul în care obiectivul este de a declanșa finalizarea tranzacției în. oricum (cu excepția cazului în care are loc tranzacția în timpul unei erori fatale), codul de declanșare nu poate include sistemul de comanda ROLLBACK TRANZACȚIE.

Măsuri de precauție pentru utilizarea Transact-SQL

Codul de declanșare utilizat instrucțiuni SELECT și PRINT, și atribuie valori variabilelor. Cu toate acestea, utilizarea acestor operatori pentru a reveni seturi de rezultate, valori silențioase și sigure. De obicei, un declanșator este transparent pentru utilizator sau aplicație. Dar, în cazul în care cererea nu este programat să se ocupe de valorile de returnare, de exemplu, rezultatul set de instrucțiunea SELECT, defecțiunea poate apărea în cerere. Cu toate acestea, utilizarea SELECT ca un furnizor de valoare este destul de acceptabil pentru o verificare condiție a operatorului. De exemplu, puteți utiliza instrucțiunea SELECT pentru a verifica existența unei anumite valori și a reveni ca valoarea operatorului IF EXISTS pentru o prelucrare ulterioară. Pentru a atribui valori variabilelor care urmează să fie incluse în cele FTC etc ogrammy SET comandă de declanșare NOCOUNT ON.

Bistabilele nu sunt permise ca urmare a declarațiilor Transact-SQL:

  • ALTER, CREATE, DROP, RESTORE DATABASE și LOAD;
  • LOAD și restabiliți LOG;
  • DISK REDIMENSIONARE și INIT DISK;
  • Reconfigura.

Declanșatoare vă permit să pună în aplicare orice acțiune pe masă sau pentru a vizualiza în loc (în loc de-declanșatoare) sau executarea după (după-declanșatori) de INSERT, UPDATE sau DELETE. Declanșatoare permit să rezolve diverse probleme.

§ Calcularea rezultatelor intermediare, precum și alte valori calculate. Baza de date este în continuă schimbare pe măsură ce adăugați, ștergeți și modificați datele din tabelele sale. În unele cazuri, „date de coloană dintr-un tabel pot fi calculate pe baza datelor modificate într-un alt tabel. Declanșatori sunt un ideal mijloc de punere în aplicare coloane calculate. Fig. 9-3 arată un declanșator care este utilizat pentru a actualiza prețul de vânzare cu amănuntul a mărfurilor în tabelul de stocuri la schimbarea prețului mediu de gros Achiziționarea unui tabel.

Pe lângă un declanșator atașat la masa de cumpărare. Acesta calculează prețul mediu optopuyu pentru mărfurile într-un depozit, creste-l cu 30%, și actualizează coloana valoarea retail_price în tabelul de inventar:

CREATE TRIGGER Retail_Price_Update

DUPĂ INSERT, UPDATE, DELETE AS

IF EXISTS (SELECT item_num DIN inserat)

(SELECT (USM (pur.total_cost) / USM (pur.qty_ordered) * 1.30)

De cumpărare de INTERIOARĂ PUR TE inuri a inserat

ON pur. item_num = ins. item_num)

DIN INV inventar, inserat in-uri

UNDE INV. item_num - uri. it'3m_num

ELSE IF EXISTS (SELECT item_ium de șters)

(SELECT (USM (pur.total_cost) / USM (pur.qty_ordered)

De cumpărare de INTERIOARĂ PUR TE eliminat del

ON pur.item_num = del.iteT_num)

DIN INV inventar, eliminat del

UNDE inv.item_num = del.item_nurn

RAISERROR ( „Prețul de vânzare cu amănuntul nu a fost ajustat pentru produsul respectiv.“, 16,1)

Declanșatorul este instrucțiunea SET NOCOUNT ON aplicată, astfel încât atunci când incendiile de declanșare și actualizează datele din tabelul de inventar. Rezultatele SELECT nu sunt afișate. În continuare, o verificare a existenței sau șterse tabelelor inserate. Dacă oricare dintre aceste tabele, nu există înregistrări, apoi utilizând o comandă de declanșare sistem RAISERROR imprimă un mesaj standard care valoarea prețul nu sa schimbat. Cele SysMessages de masă sistem poate adăuga, de asemenea, un mesaj personalizat înseamnă procedura sp_addmessage. și apoi în loc de mesaje text creat pentru a specifica un număr.

§ Crearea de înregistrări de audit. Din motive de securitate sau pur și simplu pentru a urmări operațiunile efectuate pe o masă (sau mese), puteți crea un declanșator într-o bază de date. Se colectează date în tabel, în scris, modificat sau șters dintr-un alt tabel sau vizualizare.

§ Apel acțiuni externe. Declanșatorul este permis să se specifice acțiunile care depășesc prelucrarea standard de baze de date. De exemplu, în lecția 2 am arătat un exemplu de utilizare într-un declanșator xp_sendmail procedură stocată extinsă. care trimite un mesaj e-mail când apare pe trăgaci.

§ Implementarea de protecție complexă a integrității datelor. Uneori, standardul pentru protecția măsurilor de integritate a datelor nu sunt suficiente. De exemplu, o cascadă șterge operație poate șterge înregistrări din alte tabele, în timp ce îndepărtarea simplă ar încălca integritatea referențială între tabele. Totuși îndepărtarea cascadă poate fi de nedorit. Apoi, în loc de a șterge intrările din tabelele aferente utilizate în locul-flop, iar înregistrările șterse sunt plasate într-un alt tabel pentru verificare ulterioară. La ștergerea înregistrărilor utilizate în locul-declanșare, apoi pune în aplicare o operație de ștergere prin utilizarea în cascadă integritatea referențială nu va reuși. Pentru a îndeplini aceeași sarcină, trebuie să programați operația în cascadă șterge de declanșare.

În acest exercițiu, veți crea și verifica pe trăgaci care înregistrează valoarea de 1 din coloana Vândute tabelul cărți din datele BookShopDB baza de date. Puteți programa, de asemenea, prelucrarea suplimentară care duce Vandut coloana la starea inițială, punând-l la 0, în cazul în care clientul returnează cartea.

4 Crearea de declanșare INSERT pentru o masă BookOrders

  1. Deschideți Query Analyzer și conectarea la serverul local.
  2. În panoul Editor al ferestrei de interogare, introduceți și să execute codul de mai jos:

CREATE TRIGGER dbo.update_book_status

DE LA bookorders bo INTERIOARĂ am introdus TE

ON bo.orderid = i.orderid)

CREATE TRIGGER creează un declanșator pe nume Update_Book_Status și leagă-l la masa BookOrders din baza de date BookShopDB. Acest declanșator este activat atunci când datele se adaugă la BookOrders de masă și actualizări Vandute valoarea câmpului cu numărul corespunzător din tabelul TitlelD Books.

4 Adăugarea pentru a declanșa eliminarea procesarea și actualizarea BookOrders tabele de date

1. În panoul Editor al ferestrei de interogare, introduceți și să execute codul de mai jos:

ALTER TRIGGER dbo.update_book_status

DUPĂ INSERT, DELETE

Dacă există (SELECT * FROM inserat)