Creeaza.com - informatii profesionale despre


Evidentiem nevoile sociale din educatie - Referate profesionale unice



Acasa » referate » informatica
DECLANSATORI

DECLANSATORI



DECLANSATORI

Un declansator (trigger) este o procedura care este executata in mod implicit, atunci cand asupra tabelului asociat este lansata o comanda INSERT, UPDATE sau DELETE.

Declansatorii pot contine instructiuni SQL sau Transact-SQL care sunt executate ca un intreg si pot invoca alte proceduri si alti declansatori. Decansatorul este invocat fie inaite, fie dupa sau poate inlocui executarea comenzii INSERT, UPDATE sau DELETE.

Limbajul Transact-SQL pastreaza doua tabele logice (conceptuale): unul numit deleted si altul numit inserted, Aceste tabele arata identic din punct de vedere al structurii cu tabelul in care este creat declansatorul. Ele sunt folosite pentru a pastra ultimele modificari facute tabelului curent.

La folosirea obiectelor declansator se presupune respectarea   conditiilor:

-        Declansatoarele nu pot fi create in tabele temporare


-        Declansatoarele trebuie sa fie create in tabele din baza de date curenta

-        La eliminarea unui tabel, toate obicetele declansator asociate cu acest tabel sunt eliminate automat impreuna cu tabelul

Crearea unui declansator se realizeaza cu instructiunea:

CREATE TRIGGER trigger_name
 ON
       [ WITH ENCRYPTION ]
      
       [ WITH APPEND ]
       [ NOT FOR REPLICATION ]
AS
       [ UPDATE ( column ) ]
       [ n ]
       | IF ( COLUMNS_UPDATED ( ) updated_bitmask )
       column_bitmask [ n ]
        } ]
instructiuni sql [ n ]
       }
       }

trigger_name

Este numele declansatorului (trigger-ului). Un nume de declansator trebuie sa respecte regulile pentru identificatori si trebuie sa fie unic in cadrul unei baze de date.

Table | view

Este tabele sau vederea in care declansatorul este executat.

WITH ENCRYPTION

Cripteaza intrarile in tabela syscomments  care contine textul comenzii CREATE TRIGGER.

AFTER

Specifica faptul ca declansatorul este executat doar cand toate operatiile din enuntul SQL al declansatorului au fost execuate cu succes. Toate actiunile referentiale in cascada si verificarile de constrangere deasemenea trebuie sa reuseasca inaite de executarea acestui trigger.

Folosirea clauzei AFTER este identica cu folosirea clauzei FOR utilizata mai mult in ultimele versiuni de SQL Server.

Declansatorii AFTER nu pot fi definiti pe vederi.

INSTEAD OF

Specifica faptul ca declansatorul este executat in locul enuntului SQL declansat, astfel suprapunand operatiile din enuntul declansatorului.

Acest tip de declansator poate fi definit pe o tabela sau pe o vedere pentru INSERT, UPDATE sau DELETE.

Este posibil sa definiti vederi din vederi unde fiecare vedere sa aiba propriul declansator INSTEAD OF.

Sunt cuvinte cheie care specifica pentru ce operatie se executa declansatorul. Este obligatorie aparitia cel putin unei optiuni.

Pentru declansatori INSTEAD OF, optiunea DELETE nu este permisa pe tabele care au legaturi referentiale ce specifica o actiune in cascada pentru optiunea ON DELETE. Asemanator, optiunea UPDATE nu este permisa pe tabele care au legaturi referentiale ce specifica o actiune in cascada pentru optiunea ON UPDATE.

instructiuni sql[ n ]
Reprezinta  conditia (conditiile) si actiunea (actiunile) declansatorului. Actiunile declansatorului  sunt scrise in Transact-SQL si pot cuprinde oricate instructini sau comenzi Transact-SQL.

Cateva tabele speciale, de care am mai amintit, sunt folosite in instructiuea CREATE TRIGGER si anume: inserted si deleted.

IF UPDATE (column)

Testeaza actiunea unei comenzi INSERT sau UPDATE pentru coloana specificata si nu este folosit pentru DELETE. Mai multe coloane pot fi specificate. Deoarece numele tabelei este specificat dupa clauza ON, nu este nevoie sa includeti numele tabelei inainte de numele coloanei in clauza IF UPDATE. Pentru a testa o adaugare sau o modificare pentru mai multe coloane, specificati separat clauza UPDATE(column) dupa ce ati scris-o pe prima. IF UPDATE va returna valoarea TRUE in actiunea INSERT deoarece coloanele vor fi explicit sau implicit (NULL) inserate.

Nota Clauza IF UPDATE (column) functioneaza identic cu IF, IFELSE sau WHILE poate folosi si blocul BEGINEND.

UPDATE(column) poate fi folosit oriunde in corpul triggerului.

column

Este numele coloanei o pentru testarea actiunii INSERT sau UPDATE. Aceasta coloana poate avea orice tip de date SQL Server.Oricum coloanele calculate nu pot fi utilizate in acest context.

IF (COLUMNS_UPDATED())

Testeaza, doar intr-un declansator INSERT sau UPDATE, daca coloana sau coloanele mentionate au fost inserate sau modificate.

COLUMNS_UPDATED returneaza un tip varbinary (tip binar variabil) ce indica care coloane din tabel au fost inserate sau modificate.

Functia COLUMNS_UPDATED returneaza bitii in ordine de la stanga la dreapta, cu cel mai putin semnificativ bit in partea cea mai din stanga. Cel mai din stanga bit reprezentand prima coloana din tabel, urmatorul bit reprezentand cea de-a doua coloana etc.

COLUMNS_UPDATED returneaza mai multi octeti pentru declasatorul care a fost creat continant mai mult de 8 coloane, cu cel mai putin semnificativ byte in partea din stanga.

COLUMNS_UPDATED va returna TRUE pentru toate coloanele din actiunea INSERT deoarece coloanele au fost inserate cu valori explicite sau cu valori implicite (NULL).

COLUMNS_UPDATED poate fi folosit oriunde in corpul triggerului.

bitwise_operator

Operator pe bit folosit in comparatie.

updated_bitmask

Este o masca de tip intreg pentru acele coloanele care tocmai au fost modificate sau inserate. De exemplu, tabela t1 contine coloanele C1, C2, C3, C4, si C5. Pentru a verifica daca coloanele C2, C3, si C4 sunt toate modificate (tabela t1 avand un declansator UPDATE), specificati valoarea 14 (01110). Pentru a verifica daca doar coloana C2 este modificata, specificati valoarea 2(00010).

comparison_operator

Este operatorul de comparare. Folositi semnul egal (=) pentru a verifica daca toate coloanele specificate in updated_bitmask sunt realmente modificate.Folositi semnul mai mare (>) pentru a verifica daca oricare sau cateva din coloanele specificate in updated_bitmask sunt modificate.

column_bitmask

Este o masca de tip intreg pentru acele coloane pentru care verificam daca ele au fost modificate sau inserate.

SQL Server permite declansatori multiplii ce pot fi creati pentru fiecare eveniment de modificare de date (DELETE, INSERT, or UPDATE). De exemplu, daca este executat CREATE TRIGGER FOR UPDATE pentru o tabela care deja are un declansator UPDATE, atunci este creat un declansator aditional de tip UPDATE.

--acest declansator afiseaza pe ecran un mesaj pentru oricine incearca sa adauge sau sa modifice date din tabela Note

                IF EXISTS (SELECT name FROM sysobjects WHERE name = 'trig_mesaj' AND type = 'TR')

                DROP TRIGGER trig_mesaj

                GO

                CREATE TRIGGER trig_mesaj

                ON Note

                FOR INSERT, UPDATE

                AS RAISERROR ('S-a executat un INSERT sau un UPDATE', 16, 1)

                GO

                INSERT INTO Note VALUES ('111','5',7,'11-10-2006')

                Go

                UPDATE Note SET Nota=5 WHERE NrLeg='111' and Cod_materie='5'

--acest declansator afiseaza pe ecran anumite mesaje pentru oricine incearca sa adauge sau sa modifice date din tabela Note

                IF EXISTS (SELECT name

                                   FROM sysobjects

                                   WHERE name = 'trig1' AND type = 'TR')

                DROP TRIGGER trig1

                GO

                CREATE TRIGGER trig1

                ON Note

                FOR INSERT, UPDATE

                AS

                DECLARE @@nota integer,

                                @@Nr_leg varchar(5)

                SELECT @@Nr_leg = i.NrLeg, @@nota = i.Nota

                FROM Note N, inserted i WHERE N.NrLeg = i.NrLeg

                IF (@@nota <5 )and(@@Nr_leg like '111')

                BEGIN

                 RAISERROR ('Studentul cu NrLeg=111 are note <5', 16, 1)



                END

                ELSE

                BEGIN

                RAISERROR ('Studentul cu NrLeg=%s are note de  %d ',

                   16, 1, @@Nr_leg, @@nota)

                END

                go

                INSERT INTO Note VALUES ('111','4',6,'11-10-2006')

                go

                INSERT INTO Note VALUES ('111','4',2,'12-01-2006')

                Go

                UPDATE Note SET Nota=5 WHERE NrLeg='111' and Cod_materie='4'

                go

--declansator identic cu anteriorul cu conditia ca datele dorite a fi introduse sau modificate au fost sterse si astfel nu s-au facut modificari in tabela

                IF EXISTS (SELECT name FROM sysobjects

                WHERE name = 'trig1' AND type = 'TR')

                DROP TRIGGER trig1

                GO

                CREATE TRIGGER trig1

                ON Note

                FOR INSERT, UPDATE

                AS

                DECLARE @@nota integer,@@Nr_leg varchar(5)

                SELECT @@Nr_leg = i.NrLeg,

                 @@nota = i.Nota

                FROM Note N, inserted i WHERE N.NrLeg = i.NrLeg

                IF (@@nota <5 )and(@@Nr_leg like '111')

                BEGIN

                RAISERROR ('Studentul cu NrLeg=111 are note <6', 16, 1)

                ROLLBACK TRANSACTION

                END

                ELSE

                BEGIN

                RAISERROR ('Studentul cu NrLeg=%s are note de  %d ',

                16, 1, @@Nr_leg, @@nota)

                ROLLBACK TRANSACTION

                END

                go

                INSERT INTO Note VALUES ('111','4',6,'11-10-2006')

                Go

                INSERT INTO Note VALUES ('111','4',2,'12-01-2006')

                go

                UPDATE Note SET Nota=5 WHERE NrLeg='111' and Cod_materie='4'

                go

--acest declansator nu permite introducerea unor note nevalide

                IF EXISTS (SELECT name FROM sysobjects

                WHERE name = 'trig2' AND type = 'TR')

                DROP TRIGGER trig2

                GO

                CREATE TRIGGER trig2

                on Note

                FOR insert, update

                as

                declare @nota integer

select @nota=Note.nota from Note, inserted WHERE Note.NrLeg=inserted.NrLeg

if(@nota<=0) or (@nota>10)

begin

   RAISERROR ('Nota invalida', 16, 1)

   ROLLBACK TRANSACTION

end

go

INSERT INTO Note VALUES ('115','4',-2,'12-01-2006')

go

SELECT * FROM Note WHERE NrLeg='115'

--acest declansator adauga 2 puncte la orice nota introdusa in tabela Note

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig3' AND type = 'TR')

   DROP TRIGGER trig3

GO

CREATE  TRIGGER trig3

ON Note

AFTER INSERT

AS

   UPDATE Note

   SET Note.nota = Note.nota + 2

   FROM inserted

   WHERE Note.NrLeg = inserted.NrLeg

go

INSERT INTO Note VALUES ('105','4',4,'12-01-2006')

go

SELECT * FROM Note WHERE NrLeg='105'

--acest declansator inlocuieste o operatie insert cu operatia UPDATE din enuntul SQL al declansatorului astfel daca se doreste inserarea unei note pentru un student la o anumita materie se va face o modificarea adica se adauga 1 punct la nota introdusa anterior la acea materie pentru studentul dat in tabela Note

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig3' AND type = 'TR')

   DROP TRIGGER trig3

GO

CREATE  TRIGGER trig3

ON Note

INSTEAD OF INSERT

AS

   UPDATE Note

   SET Note.nota = Note.nota+1

   FROM inserted

   WHERE Note.NrLeg = inserted.NrLeg

go

INSERT INTO Note VALUES ('105','4',4,'12-01-2006')

go

SELECT * FROM Note WHERE NrLeg='105'

--crearea unui declansator care afiseaza un mesaj daca s-a modificat campul Nota si un alt mesaj in caz contrar

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig4' AND type = 'TR')



   DROP TRIGGER trig4

GO

CREATE  TRIGGER trig4

ON Note

FOR UPDATE

AS

IF UPDATE(Nota)

    RAISERROR ('S-a modificat campul Nota',16,1)

ELSE

    RAISERROR ('S-a modificat alt camp al tabelei NOTE',16,1)

go

UPDATE Note SET Nota=10 WHERE NrLeg='115'

go

SELECT * FROM Note WHERE NrLeg='115'

go

UPDATE Note SET Cod_materie='3' WHERE NrLeg='115'

go

UPDATE Note SET Cod_materie='3', Nota=8 WHERE NrLeg='115'

--crearea unui declansator care afiseaza un mesaj daca s-au modificat campurile Nota si Cod_materie si ‘*****’  in caz contrar

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig5' AND type = 'TR')

   DROP TRIGGER trig5

GO

CREATE  TRIGGER trig5

ON Note

FOR UPDATE

AS

IF UPDATE(Nota) AND UPDATE(Cod_materie)

    RAISERROR ('S-au modificat campurile Nota si Cod_materie',16,1)

ELSE

    RAISERROR ('*****',16,1)

go

UPDATE Note SET Nota=10 WHERE NrLeg='115'

go

SELECT * FROM Note WHERE NrLeg='115'

go

UPDATE Note SET Cod_materie='3', Nota=8 WHERE NrLeg='115'

--crearea unui declansator care afiseaza un mesaj daca s-au modificat campurile Nota sau Cod_materie si ‘*.*.*’  in caz contrar

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig6' AND type = 'TR')

   DROP TRIGGER trig6

GO

CREATE  TRIGGER trig6

ON Note

FOR UPDATE

AS

IF (COLUMNS_UPDATED()&6)>0

    RAISERROR ('S-au modificat campurile Nota sau Cod_materie',16,1)

ELSE

    RAISERROR ('*.*.*',16,1)

go

UPDATE Note SET Nota=10 WHERE NrLeg='115'

go

SELECT * FROM Note WHERE NrLeg='115'

go

UPDATE Note SET Cod_materie='3', Nota=8 WHERE NrLeg='115'

go

UPDATE Note SET Data='3-3-2002' WHERE NrLeg='115'

--crearea unui declansator care verifica daca au fost modificate printr-o comanda UPDATE coloanele 3, 6 si 9 din tabele Student

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'trig7' AND type = 'TR')

   DROP TRIGGER trig7

GO

CREATE TRIGGER trig7

ON Student

FOR UPDATE AS

   IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))--coloana 3

      + power(2,(6-1))) --coloana 6

      AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))--coloana 9 (coloana 1 din cel de-al II-lea octet

      )

   PRINT 'Coloanele 3, 6 si 9 au fost modificate'

GO

UPDATE Student

SET Initiala='O', Data_nastere='12-12-1980', NrLeg_sot='115'

WHERE NrLeg='105'

GO

SELECT * FROM Student WHERE NrLeg='105'

--crearea unui declansator pentru DELETE

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'sterge_stud' AND type = 'TR')

   DROP TRIGGER sterge_stud

GO

CREATE TRIGGER sterge_stud

ON Student

FOR DELETE

AS

DECLARE @NL varchar(5)

SELECT @NL=deleted.NrLeg FROM deleted

IF (cast(@NL as integer)>0)     

    PRINT 'S-a Sters'

ELSE

BEGIN

                PRINT 'Acest NrLeg nu exista'

                ROLLBACK TRANSACTION

END

GO

Delete From Student Where NrLeg='17'

Modificarea unui declansator se face cu comanda ALTER TRIGGER cu sintaxa:

ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]

[ NOT FOR REPLICATION ]
AS
sql_statement [ n ]
}
|

[ NOT FOR REPLICATION ]
AS
UPDATE ( column ) ]
[ n ]
| IF ( COLUMNS_UPDATED ( ) updated_bitmask )
column_bitmask [ n ]
}
sql_statement [ n ]
}
}

Stergerea unui declasator se face cu comanda:

DROP TRIGGER [ ,n ]








Politica de confidentialitate

.com Copyright © 2019 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.


Proiecte

vezi toate proiectele
 PROIECT DE LECTIE Clasa: I Matematica - Adunarea si scaderea numerelor naturale de la 0 la 30, fara trecere peste ordin
 Proiect didactic Grupa: mijlocie - Consolidarea mersului in echilibru pe o linie trasata pe sol (30 cm)
 Redresor electronic automat pentru incarcarea bateriilor auto - proiect atestat
 Proiectarea instalatiilor de alimentare ale motoarelor cu aprindere prin scanteie cu carburator

Lucrari de diploma

vezi toate lucrarile de diploma
 Lucrare de diploma - eritrodermia psoriazica
 ACTIUNEA DIPLOMATICA A ROMANIEI LA CONFERINTA DE PACE DE LA PARIS (1946-1947)
 Proiect diploma Finante Banci - REALIZAREA INSPECTIEI FISCALE LA O SOCIETATE COMERCIALA
 Lucrare de diploma managementul firmei “diagnosticul si evaluarea firmei”

Lucrari licenta

vezi toate lucrarile de licenta
 CONTABILITATEA FINANCIARA TESTE GRILA LICENTA
 LUCRARE DE LICENTA - FACULTATEA DE EDUCATIE FIZICA SI SPORT
 Lucrare de licenta stiintele naturii siecologie - 'surse de poluare a clisurii dunarii”
 LUCRARE DE LICENTA - Gestiunea stocurilor de materii prime si materiale

Lucrari doctorat

vezi toate lucrarile de doctorat
 Doctorat - Modele dinamice de simulare ale accidentelor rutiere produse intre autovehicul si pieton
 Diagnosticul ecografic in unele afectiuni gastroduodenale si hepatobiliare la animalele de companie - TEZA DE DOCTORAT
 LUCRARE DE DOCTORAT ZOOTEHNIE - AMELIORARE - Estimarea valorii economice a caracterelor din obiectivul ameliorarii intr-o linie materna de porcine

Proiecte de atestat

vezi toate proiectele de atestat
 Proiect atestat informatica- Tehnician operator tehnica de calcul - Unitati de Stocare
 LUCRARE DE ATESTAT ELECTRONIST - TEHNICA DE CALCUL - Placa de baza
 ATESTAT PROFESIONAL LA INFORMATICA - programare FoxPro for Windows
 Proiect atestat tehnician in turism - carnaval la venezia




Sinteza unui dispozitiv secvential de inmultire a numerelor binare reprezentate in complement de doi prin procedura James Robertson
Accelerarea procesului de adunare/scadere in virgula flotanta
UTILIZAREA CONCEPTELOR SPECIFICE ORGANIZATIILOR VIRTUALE IN PRACTICA MEDICALA DIN ROMANIA
Conceptul de informatie și data
Algoritmi si scheme logice
Sistemul de operare Windows XP
Newsletter-ul – corespondenta electronica
RAZBOI INFORMATIONAL


Termeni si conditii
Contact
Creeaza si tu