Sunteți pe pagina 1din 6

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Departamentul Inginerie, Software i Automatic

Raport
Lucrare de laborator Nr. 9

Tema: Crearea i utilizarea declanatoarelor


Disciplina: Baze de Date i Cunotine

Efectuat de: st.gr.TI-131 f/r Bogdan Ion

Controlat de: Bulai Rodica


Chiinu 2017

Tema: Crearea i utilizarea declanatoarelor


Scopul lucrrii: Gestionarea i executarea declanatoarelor de ctre SQL Server 2012.
Analiza declanatoarelor de tip DML, DDL i LOGON, structura declan atoarelor,
creare i executarea declanatoarelor.

Executarea lucrrii:
1. S se modifice declanatorul inregistrare_noua n aa fel nct n cazul
actualizrii adresei furnizorului s apar mesajul de informare, care va afia
numele furnizorului, adresa veche i adresa noua.

USE Calculatoare;
GO
IF OBJECT_ID ('inregistrare_noua', 'TR') IS NOT NULL
DROP TRIGGER inregistrare_noua;
GO
CREATE TRIGGER inregistrare_noua ON furnizor AFTER UPDATE
AS SET NOCOUNT ON
IF UPDATE(Adresa)
SELECT 'Adresa ' + RTRIM(UPPER(inserted.Nume)) + 'a fost schimbata de la ' +
RTRIM(UPPER(deleted.Adresa)) + ' la ' + RTRIM(UPPER(inserted.Adresa))
FROM inserted, deleted;
GO
UPDATE furnizor SET Adresa='Studentilo 7/1' WHERE Cod=1;
GO

Rezultat: Adresa Rosca Grigore a fost schimbata de la Florilor la


Studentilor 7/1

2. S se creeze declanatoarele care ar insera corect (consecutiv) datele n baza de


date calculatoare i ar permite evitarea erorilor la nivelul cheilor externe.

USE Calculatoare;
GO
IF OBJECT_ID ('inserare_fara_erori', 'TR') IS NOT NULL
DROP TRIGGER inserare_fara_erori;
GO
CREATE TRIGGER inserare_fara_erori ON pc_uri INSTEAD OF INSERT
AS
DECLARE @Model varchar(4)
SET @Model = (SELECT inserted.Model FROM inserted)
IF (@Model NOT IN(SELECT Model FROM produse WHERE Tip='PC'))
BEGIN
INSERT INTO produse VALUES('W',@Model,'Laptop_uri')
END
GO
INSERT INTO pc_uri(Cod, Model, Viteza, Ram, Hd, Cd, Pret) VALUES (12,1500,500,64,5,'12x',600);
3. S se creeze un declanator care ar interzice tergerea modelelor produselor
productorului A, produselor care cost mai mult de 300, precum i editarea
valorilor cmpului Cod. Se va afia un mesaj de avertizare n cazul tentativei de a
nclca constrngerea.

USE Calculatoare;
GO
IF OBJECT_ID ('interzice_stergerea_A', 'TR') IS NOT NULL
DROP TRIGGER interzice_stergerea_A;
GO
CREATE TRIGGER interzice_stergerea_A ON pc_uri AFTER UPDATE, DELETE
AS
IF EXISTS (SELECT deleted.Model FROM deleted INNER JOIN produse ON
deleted.Model=produse.Model
WHERE produse.Producator='A' OR deleted.Pret>=300)
BEGIN
PRINT ('Tentativa esuata de a modifica un produs al producatorului "A"');
ROLLBACK
END
GO
DELETE FROM pc_uri WHERE Model='1232';
GO

4. S se creeze un declanator DDL care ar interzice modificarea coloanei Model n


tabelele bazei de date calculatoare cu afiarea mesajului respectiv.

USE Calculatoare;
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class=0 AND name='Modificare')
DROP TRIGGER Modificare ON DATABASE;
GO
CREATE TRIGGER Modificare ON DATABASE
AFTER ALTER_TABLE
AS
DECLARE @cmd sysname
SET @cmd=EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]','nvarchar(max)');
IF (@cmd LIKE '%ALTER COLUMN%Pret%')
BEGIN
PRINT ('Este interzisa modificarea coloanei Model');
ROLLBACK
END
GO
ALTER TABLE pc_uri ALTER COLUMN Pret float;
GO
5. S se creeze un declanator DDL care ar interzice modificarea schemei bazei de
date n afara orelor de lucru.

USE Calculatoare;
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class=0 AND name='Orar_lucru')
DROP TRIGGER Orar_lucru ON DATABASE;
GO
CREATE TRIGGER Orar_lucru ON DATABASE
AFTER ALTER_TABLE
AS
IF (DATEPART (HH,GETDATE())NOT BETWEEN 9 AND 17)
BEGIN
PRINT ('Modificarea Bazei de Date este interzisa in afara orelor de lucru');
ROLLBACK
END
GO
ALTER TABLE pc_uri DROP COLUMN Cod;
GO

6. S se creeze un declanator DDL care, la modificarea proprietilor coloanei Pret


dintr-un tabel, ar face schimbri asemntoare n mod automat n restul tabelelor.

USE Calculatoare;
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class=0 AND name='Modificare_Coloane')
DROP TRIGGER Modificare_Coloane ON DATABASE;
GO
CREATE TRIGGER Modificare_Coloane ON DATABASE
AFTER ALTER_TABLE
AS
DECLARE @cmd varchar(max)
DECLARE @schema varchar(max)
DECLARE @cmd1 varchar(max)

SET @cmd=EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]','varchar(MAX)')
SET @schema=EVENTDATA().value('(/EVENT_INSTANCE/Objectname)[1]','varchar(MAX)')
SET @cmd1=REPLACE(@cmd,@schema,'****')

IF @cmd LIKE '%Pret'


BEGIN
IF (@schema != 'pc_uri')
BEGIN
SET @cmd1=REPLACE (@cmd,'****','pc_uri')
EXECUTE(@cmd1)
END

IF (@schema != 'laptop_uri')
BEGIN
SET @cmd1=REPLACE (@cmd,'****','laptop_uri')
EXECUTE(@cmd1)
END

IF (@schema != 'imprimante')
BEGIN
SET @cmd1=REPLACE (@cmd,'****','imprimante')
EXECUTE(@cmd1)
END
END
GO

Concluzie:
n urma realizrii acestei lucrri de laborator am studiat gestionarea i executarea
declanatoarelor de ctre SQL Server 2014. Am analizat declanatoarele de tip DML,
DDL i LOGON, structura declanatoarelor, crearea i executarea lor.