----------------------------------------------------------------------------------- /* Vježbe se rade na bazi AdventureWorksOBP. */ USE AdventureWorksOBP GO ----------------------------------------------------------------------------------- -- Zadatak 1. /* VARIJABLE Deklarirajte varijable @Ime i @Prezime i dodijelite im neke vrijednosti. Ispišite dodijeljene vrijednosti. */ DECLARE @Ime nvarchar(50) DECLARE @Prezime nvarchar(50) SET @Ime = 'Miro' SET @Prezime = 'Mirić' PRINT @Ime PRINT @Prezime PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime GO ----------------------------------------------------------------------------------- -- Zadatak 2. /* VARIJABLE Deklarirajte varijable @Ime i @Prezime i dodijelite im vrijednosti iz tablice Kupac za IDKupac jednak 8812. Ispišite dodijeljene vrijednosti. */ DECLARE @Ime nvarchar(50) DECLARE @Prezime nvarchar(50) SELECT @Ime = Ime, @Prezime = Prezime FROM Kupac WHERE IDKupac = 8812 PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime GO ----------------------------------------------------------------------------------- -- Zadatak 3. /* VARIJABLE Deklarirajte varijable @Ime i @Prezime i dodijelite im vrijednosti iz tablice Kupac tako da odaberete sve retke iz tablice. Ispišite dodijeljene vrijednosti. */ DECLARE @Ime nvarchar(50) DECLARE @Prezime nvarchar(50) SELECT @Ime = Ime, @Prezime = Prezime FROM Kupac PRINT 'Korisnik: ' + @Ime + ' ' + @Prezime GO ----------------------------------------------------------------------------------- SET NOCOUNT ON ----------------------------------------------------------------------------------- -- Zadatak 4. /* IF-ELSE IF-ELSE i SCOPE_IDENTITY() Provjerite broj zapisa u tablici Kupac. Ako ih ima više ili jednako 20000, ispišite “Postoji više od 20000 kupaca :)”. Ako ih ima manje, ispišite “Još nismo dostigli 20000 kupaca :(” */ DECLARE @Broj int SELECT @Broj = COUNT(*) FROM dbo.Kupac IF @Broj >= 20000 PRINT 'Postoji više od 20000 kupaca :)' ELSE PRINT 'Još nismo dostigli 20000 kupaca :(' GO ----------------------------------------------------------------------------------- -- Zadatak 5. /* IF-ELSE IF-ELSE i SCOPE_IDENTITY() Umetnite zapis u tablicu Drzava, generiranu IDENTITY vrijednost dodijelite nekoj varijabli pa je ispišite. */ DECLARE @NoviID int INSERT INTO Drzava VALUES ('Gruzija') SET @NoviID = SCOPE_IDENTITY() PRINT @NoviID GO ----------------------------------------------------------------------------------- -- Zadatak 6. /* IF-ELSE IF-ELSE i SCOPE_IDENTITY() Umetnite zapis u tablicu Drzava i u varijablu spremite generiranu IDENTITY vrijednost. Iskoristite tu vrijednost da biste za tu državu umetnuli dva grada. */ DECLARE @IDDrzavaNovi int INSERT INTO Drzava VALUES ('Kina') select SCOPE_IDENTITY() SET @IDDrzavaNovi = SCOPE_IDENTITY() INSERT INTO Grad VALUES ('Šangaj', @IDDrzavaNovi) INSERT INTO Grad VALUES ('Peking', @IDDrzavaNovi) GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Izrada log tablice. CREATE TABLE Zapisnik ( IDZapisnik int IDENTITY(1,1) PRIMARY KEY, Poruka nvarchar(max), Vrijeme datetime DEFAULT getdate() ) GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 1. /* Napravite okidač kojim ćete svako umetanje retka u tablicu Grad zapisati u tablicu Zapisnik. Umetnite redak. */ CREATE TRIGGER Okidac1 ON Grad AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Umetnut redak u Grad!') GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 1', 1) SELECT * FROM Zapisnik GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 2. /* Promijenite okidač tako da zapiše ID i naziv umetnutog grada u Zapisnik. Umetnite redak. */ ALTER TRIGGER Okidac1 ON Grad AFTER INSERT AS DECLARE @ID int DECLARE @Naziv nvarchar(50) SELECT @ID = IDGrad, @Naziv = Naziv FROM inserted INSERT INTO Zapisnik (Poruka) VALUES ('Umetnut redak u Grad. IDGrad: ' + CAST(@ID as nvarchar(50)) + ', Naziv: ' + @Naziv) GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 2', 1) SELECT * FROM Zapisnik GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 3. /* Promijenite okidač tako da se veže uz sve događaje i u Zapisnik zapisuje broj redaka u inserted i deleted tablicama. Umetnite dva nova grada, promijenite im države i na kraju ih obrišite. */ ALTER TRIGGER Okidac1 ON Grad AFTER INSERT, UPDATE, DELETE AS DECLARE @i int DECLARE @d int SELECT @i = COUNT(*) FROM inserted SELECT @d = COUNT(*) FROM deleted INSERT INTO Zapisnik (Poruka) VALUES ('inserted: ' + CAST(@i as nvarchar(20)) + ', deleted: ' + CAST(@d as nvarchar(20))) GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 3', 1) INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 4', 1) SELECT * FROM Zapisnik UPDATE Grad SET DrzavaID = 2 WHERE Naziv LIKE 'Grad%' SELECT * FROM Zapisnik DELETE FROM Grad WHERE Naziv LIKE 'Grad%' SELECT * FROM Zapisnik GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 4. /* Promijenite okidač tako da upisuje staru i novu vrijednost promijenjenog naziva grada u Zapisnik. Promijenite naziv jednom gradu. */ ALTER TRIGGER Okidac1 ON Grad AFTER UPDATE AS DECLARE @old nvarchar(50) DECLARE @new nvarchar(50) SELECT @old = Naziv FROM deleted SELECT @new = Naziv FROM inserted INSERT INTO Zapisnik (Poruka) VALUES ('Stara: ' + @old + ', nova: ' + @new) GO UPDATE Grad SET Naziv = 'Daruvar' WHERE IDGrad = 1 SELECT * FROM Zapisnik GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 5. /* Onemogućite okidač iz prethodnih primjera i promijenite neki redak u tablici. Ponovno ga omogućite. Napravite opet promjenu. Uklonite okidač. */ DISABLE TRIGGER Okidac1 ON Grad GO UPDATE Grad SET Naziv = 'Bjelovar' WHERE IDGrad = 1 SELECT * FROM Zapisnik GO ENABLE TRIGGER Okidac1 ON Grad GO UPDATE Grad SET Naziv = 'Vukovar' WHERE IDGrad = 1 SELECT * FROM Zapisnik GO DROP TRIGGER Okidac1 GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 6. /* Dodajte novi okidač na tablicu Grad i vežite ga uz sva tri događaja. U okidaču saznajte koji događaj ga je pozvao i tu informaciju upišite u Zapisnik. Napravite umetanje, izmjenu i brisanje nekog retka. Uklonite okidač. */ CREATE TRIGGER Okidac2 ON Grad AFTER INSERT, UPDATE, DELETE AS IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) BEGIN -- INSERT. INSERT INTO Zapisnik (Poruka) VALUES ('Desio se INSERT.') END ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN -- DELETE. INSERT INTO Zapisnik (Poruka) VALUES ('Desio se DELETE.') END ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN -- UPDATE. INSERT INTO Zapisnik (Poruka) VALUES ('Desio se UPDATE.') END GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 5', 1) SELECT * FROM Zapisnik UPDATE Grad SET Naziv = 'Ilok' WHERE IDGrad = 1 SELECT * FROM Zapisnik DELETE FROM Grad WHERE IDGrad = 76 SELECT * FROM Zapisnik GO DROP TRIGGER Okidac2 GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 7. /* Dodajte novi okidač i vežite ga uz UPDATE događaj na tablici Grad. Neka okidač zapiše u Zapisnik da se desio događaj samo ako je promijenjen stupac DrzavaID. Uklonite okidač. */ CREATE TRIGGER Okidac3 ON Grad AFTER UPDATE AS IF UPDATE(DrzavaID) BEGIN INSERT INTO Zapisnik (Poruka) VALUES ('Promijenjen je stupac DrzavaID.') END GO UPDATE Grad SET Naziv = 'Šibenik' WHERE IDGrad = 1 SELECT * FROM Zapisnik UPDATE Grad SET DrzavaID = 3 WHERE IDGrad = 1 SELECT * FROM Zapisnik GO DROP TRIGGER Okidac3 GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 8. /* Dodajte 4 nova okidača koji u zapisnik ispisuju "Pozdrav iz broja n" nakon umetanja retka. Umetnite redak. Posložite redoslijed okidača tako da bude 4, 2, 3, 1. Umetnite redak. Vratite originalni redoslijed. Umetnite redak. Uklonite okidače. */ CREATE TRIGGER Okidac1 ON Grad AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 1') GO CREATE TRIGGER Okidac2 ON Grad AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 2') GO CREATE TRIGGER Okidac3 ON Grad AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 3') GO CREATE TRIGGER Okidac4 ON Grad AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Pozdrav iz broja 4') GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 6', 1) SELECT * FROM Zapisnik GO EXEC sp_settriggerorder 'Okidac4', 'FIRST', 'INSERT' EXEC sp_settriggerorder 'Okidac1', 'LAST', 'INSERT' GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 7', 1) SELECT * FROM Zapisnik GO EXEC sp_settriggerorder 'Okidac4', 'NONE', 'INSERT' EXEC sp_settriggerorder 'Okidac1', 'NONE', 'INSERT' GO INSERT INTO Grad (Naziv, DrzavaID) VALUES ('Grad 8', 1) SELECT * FROM Zapisnik GO DROP TRIGGER Okidac1 DROP TRIGGER Okidac2 DROP TRIGGER Okidac3 DROP TRIGGER Okidac4 GO ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -- Zadatak 9. /* Napravite tablice Tbl1 i Tbl2 s proizvoljnim stupcima. Na Tbl1 napravite okidač vezan uz INSERT koji umeće retke u Tbl2 i u Zapisnik. Na Tbl2 napravite okidač vezan uz INSERT koji umeće retke u Tbl1 i u Zapisnik. Umetnite jedan redak u Tbl1. Što piše u svakoj od tablica? */ CREATE TABLE Tbl1 ( Stupac1 int PRIMARY KEY IDENTITY, Stupac2 nvarchar(50) ) CREATE TABLE Tbl2 ( Stupac1 int PRIMARY KEY IDENTITY, Stupac2 nvarchar(50) ) GO CREATE TRIGGER Okidac1 ON Tbl1 AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Okidač 1 na tablici 1') INSERT INTO Tbl2 VALUES ('Upis u drugu tablicu') GO CREATE TRIGGER Okidac2 ON Tbl2 AFTER INSERT AS INSERT INTO Zapisnik (Poruka) VALUES ('Okidač 2 na tablici 2') INSERT INTO Tbl1 VALUES ('Upis u prvu tablicu') GO INSERT INTO Tbl1 VALUES ('Upis u prvu tablicu') SELECT * FROM Zapisnik GO SELECT * FROM Tbl1 SELECT * FROM Tbl2 SELECT * FROM Zapisnik ----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------