--Zadatak 11.
create proc zad11
@ime nvarchar (50),
@prezime nvarchar (50),
@id int output
as
if not exists (select * from Komercijalist where Ime= @ime and Prezime = @prezime)
begin
insert into Komercijalist(Ime, Prezime) values (@ime, @prezime)
set @id = SCOPE_IDENTITY()
end
else
begin
set @id = -1
end
declare @ajdi int
exec zad11 'gLjIvo', 'Ivankovic', @ajdi output
print @ajdi
-- Zadatak 12.
CREATE PROC prUmetanjeGradova
@NazivDrzave nvarchar(50),
@NazivGrada1 nvarchar(50),
@NazivGrada2 nvarchar(50)
AS
DECLARE @IDDrzave int
IF EXISTS(SELECT * FROM Drzava WHERE Naziv = @NazivDrzave) BEGIN
SELECT @IDDrzave = IDDrzava
FROM Drzava
WHERE Naziv = @NazivDrzave
END
ELSE BEGIN
INSERT INTO Drzava (Naziv)
VALUES
(@NazivDrzave)
SET @IDDrzave = SCOPE_IDENTITY()
END
INSERT INTO Grad (Naziv, DrzavaID)
VALUES
(@NazivGrada1, @IDDrzave),
(@NazivGrada2, @IDDrzave)
GO
EXEC prUmetanjeGradova 'Kolumbija', 'Gradic1', 'Gradak'
EXEC prUmetanjeGradova 'Kolumbija', 'Gradic1', 'Gradak'
GO
-- Zadatak 13.
CREATE PROC prCreateOrUpdate
@IDPotkategorije int, /* NULL - CREATE, OSTALO - UPDATE */
@NazivPotkategorije nvarchar(50),
@IDKategorije int
AS
IF @IDPotkategorije IS NULL BEGIN /* CREATE */
INSERT INTO Potkategorija (KategorijaID, Naziv)
VALUES
(@IDKategorije, @NazivPotkategorije)
END
ELSE BEGIN /* UPDATE */
UPDATE Potkategorija
SET
KategorijaID = @IDKategorije,
Naziv = @NazivPotkategorije
WHERE IDPotkategorija = @IDPotkategorije
END
GO
CREATE PROC prReadOrDelete
@IDPotkategorije int,
@Delete bit /* 0 - READ, 1 - DELETE */
AS
IF @Delete = 0 BEGIN /* READ */
SELECT *
FROM Potkategorija
WHERE IDPotkategorija = @IDPotkategorije
END
ELSE IF @Delete = 1 BEGIN /* DELETE */
DELETE
FROM Potkategorija
WHERE IDPotkategorija = @IDPotkategorije
END
GO
------Moa verzija 13-----------
CREATE PROC upda_insert
@IDPotkategorije int output,
@Naziv nvarchar(50),
@KategorijeID int
as
if exists (select * from Potkategorija
where IDPotkategorija = @IDPotkategorije)
begin
update Potkategorija
set KategorijaID = @KategorijeID, Naziv = @Naziv
where IDPotkategorija = @IDPotkategorije
end
else
begin
insert into Potkategorija (KategorijaID, Naziv)
values (@KategorijeID, @Naziv)
set @IDPotkategorije = SCOPE_IDENTITY()
end
go
CREATE PROC read_delete
@IDPotkategorije int,
@Delete bit /* 0 - READ, 1 - DELETE */
AS
IF @Delete = 0
BEGIN /* READ */
SELECT *
FROM Potkategorija
WHERE IDPotkategorija = @IDPotkategorije
END
ELSE IF @Delete = 1
BEGIN /* DELETE */
DELETE
FROM Potkategorija
WHERE IDPotkategorija = @IDPotkategorije
END
GO
declare @ajd int
exec upda_insert @ajd output, 'Koooglice', 2
exec upda_insert 41, 'Koooglice', 3
exec read_delete 41, 0
exec read_delete 43, 1
select * from Potkategorija
where Naziv = 'Koooglice'
------------------------ I4 ----------------------------------
-- Zad. 1.
-- prvi dio zadatka, do "Ako postoji država..."
CREATE PROC Zad1I4
@NazivDrzave nvarchar (50),
@izlazni int output
AS
INSERT INTO Drzava (Naziv) VALUES (@NazivDrzave)
SELECT @izlazni = Drzava.IDDrzava FROM Drzava
WHERE Drzava.Naziv = @NazivDrzave
GO
DECLARE @var int
EXEC Zad1I4 'TestnaDrzava', @var output
-- procedura i sa drugim dijelom, gdje se provjerava dali Drzava.Naziv vec postoji u bazi
ALTER PROC Zad1I4
@NazivDrzave nvarchar (50),
@izlazni int output
AS
IF EXISTS (SELECT Drzava.Naziv FROM Drzava WHERE Drzava.Naziv = @NazivDrzave)
BEGIN
PRINT -1
RETURN -1
END
ELSE
BEGIN
INSERT INTO Drzava (Naziv) VALUES (@NazivDrzave)
SELECT @izlazni = Drzava.IDDrzava FROM Drzava
WHERE Drzava.Naziv = @NazivDrzave
PRINT @izlazni -- radi testiranja
END
GO
DECLARE @var int
EXEC Zad1I4 'TestnaDrzava', @var output
GO
-- isprintano 7, drzava je dodana pod ID-em 7.
DECLARE @var int
EXEC Zad1I4 'TestnaDrzava', @var output
GO
-- isprintano i vraćeno -1 jer Drzava pod timo Nazivom već postoji
DELETE FROM Drzava WHERE Naziv = 'TestnaDrzava'
-- Zad. 2
CREATE FUNCTION Zad2I4
(
@IDKategorije int
)
RETURNS int
AS
BEGIN
DECLARE @var int
SELECT @var = COUNT (Kategorija.IDKategorija)
FROM Proizvod, Kategorija JOIN Potkategorija
ON Kategorija.IDKategorija = Potkategorija.KategorijaID
WHERE IDKategorija = @IDKategorije
GROUP BY Proizvod.PotkategorijaID, Potkategorija.IDPotkategorija
HAVING Proizvod.PotkategorijaID = Potkategorija.IDPotkategorija
IF @var <= 0 OR @var = NULL
BEGIN
RETURN 0
END
IF @var > 0
BEGIN
RETURN @var
END
RETURN @var
END
GO
DECLARE @poziv int
SET @poziv = dbo.Zad2I4 (2)
SELECT @poziv
GO
SELECT * FROM Kategorija
-- Zad. 3
SELECT * FROM Drzava
CREATE PROC Zad3I4 (@naredba char(1), @IDDrzave int, @Naziv nvarchar(50))
AS
IF @naredba = 'I'
BEGIN
INSERT INTO Drzava (Naziv) VALUES (@Naziv)
END
ELSE IF @naredba = 'U'
BEGIN
UPDATE Drzava
SET Naziv = @Naziv
WHERE Drzava.IDDrzava = @IDDrzave
END
ELSE IF @naredba = 'D'
BEGIN
DELETE FROM Drzava
WHERE Drzava.IDDrzava = @IDDrzave
END
ELSE IF @naredba = 'R'
BEGIN
SELECT * FROM Drzava
WHERE Drzava.IDDrzava = @IDDrzave
END
go
SELECT * FROM Drzava
EXEC Zad3I4 'I', NULL, 'TestDrzava1'
EXEC Zad3I4 'U', 8, 'TestDrzava2'
EXEC Zad3I4 'R', 8, NULL
EXEC Zad3I4 'D', 8, NULL
CREATE FUNCTION Zad3I4
(
@naredba char(1), @IDDrzave int, @Naziv nvarchar(50)
)
RETURNS int
AS
BEGIN
DECLARE @tabl TABLE (IDDrzave int, Naziv nvarchar(50))
DECLARE @print as int
set @print = 1
SET @print = (SELECT * FROM @tabl WHERE IDDrzave = @IDDrzave)
IF @naredba = 'I'
BEGIN
INSERT INTO @tabl (IDDrzave) VALUES (@Naziv)
END
ELSE IF @naredba = 'U'
BEGIN
UPDATE Drzava
SET Naziv = @Naziv
WHERE Drzava.IDDrzava = @IDDrzave
END
ELSE IF @naredba = 'D'
BEGIN
DELETE FROM @tabl
WHERE IDDrzave = @IDDrzave
END
ELSE IF @naredba = 'R'
BEGIN
return @print
END
RETURN @print
END
----------------------------ISHOD 4-----------------------
create proc p1
@Naziv nvarchar(50),
@IDdrzava int output
as
insert into Grad(naziv,DrzavaID)
values(@Naziv,@IDdrzava)
exec p1 'naziv',2
exec p2 'naziv',2
go
CREATE PROC CRUD
@Operacija char(1),
@IDStudent int OUTPUT,
@Ime nvarchar(50),
@Prezime nvarchar(50),
@JMBAG char(11)
AS
IF @Operacija = 'U'
UPDATE Student
SET Ime = @Ime, Prezime = @Prezime, JMBAG = @JMBAG
WHERE IDStudent = @IDStudent
ELSE IF @Operacija = 'I' BEGIN
INSERT INTO Student (Ime, Prezime, JMBAG) VALUES (@Ime, @Prezime, @JMBAG)
SET @IDStudent = SCOPE_IDENTITY()
END
ELSE IF @Operacija = 'D'
DELETE FROM Student WHERE IDStudent = @IDStudent
exec CRUD 'U',5,'DJURO','DJURIC','a'
exec CRUD 'D',5,'DJURO','DJURIC','a'
exec CRUD 'I',5,'DJURO','DJURIC','a'
-------ISHOD 5------------
CREATE TABLE Zapisnik
(
IDZapisnik int IDENTITY(1,1) PRIMARY KEY,
Poruka nvarchar(max),
Vrijeme datetime DEFAULT getdate()
)
go
create trigger triger on Drzava after insert,update,delete
AS
DECLARE @naziv nvarchar(50)
SELECT @naziv=IDDrzava from inserted
IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted)
BEGIN
insert into Zapisnik (Sadrzaj) values ('Umetnut je novi redak s IDDrzava :' + @naziv + '"')
END
ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
BEGIN
insert into Zapisnik(Sadrzaj) values ('Obrisan je redak s IDDrzava :' + @naziv + '"')
END
ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) BEGIN
insert into Zapisnik(Sadrzaj) values ('Primijenjen je redak s IDDrzava : '+ @naziv + '"')
end
go
select * from Zapisnik
insert into Drzava(Naziv) values('Kasokasapa')
delete from Drzava where Naziv = 'Kasokasapa'
select * from Drzava
go
------------------------------------------------
alter trigger trigiii on KreditnaKartica after update
as
declare @istekgodina int
declare @istekmjesec int
select @istekgodina=IstekGodina from inserted
select @istekmjesec=IstekMjesec from inserted
IF EXISTS(select @istekgodina) AND EXISTS(select @istekmjesec)
BEGIN
insert into Zapisnik1(Sadrzaj) values ('Primijenjen trajanje više kartica : ')
end
go
update KreditnaKartica
set tip='American', Broj='102102',IstekGodina=2015
where IDKreditnaKartica=2
---------------------I5 ---------------------
-- Zad. 1 --
CREATE TABLE Zapisnik (Datum_i_vrijeme datetime, Sadrzaj nvarchar(500))
GO
DROP TABLE Zapisnik
CREATE TRIGGER Zad4I5
ON Drzava
AFTER INSERT, UPDATE, DELETE
AS
IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
BEGIN
INSERT INTO Zapisnik (Sadrzaj, Datum_i_vrijeme)
SELECT 'Promijenjen je redak s IDDrzava ' + CAST(IDDrzava as nvarchar), getdate() FROM inserted
END
IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
BEGIN
INSERT INTO Zapisnik (Sadrzaj, Datum_i_vrijeme)
SELECT 'Umetnut je novi redak s IDDrzava ' + CAST(IDDrzava as nvarchar), getdate() FROM inserted
END
IF NOT EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
BEGIN
INSERT INTO Zapisnik (Sadrzaj, Datum_i_vrijeme)
SELECT 'Obrisan je redak s IDDrzava ' + CAST(IDDrzava as nvarchar), getdate() FROM deleted
END
GO
INSERT INTO Drzava (Naziv) VALUES ('TestnaDrzava_5')
UPDATE Drzava
SET Naziv = 'Kanada'
WHERE IDDrzava = 10
DELETE FROM Drzava WHERE IDDrzava = 10
SELECT * FROM Drzava
SELECT * FROM Zapisnik
-- Zad 2.
CREATE TRIGGER Zad2I5
ON KreditnaKartica
AFTER UPDATE
AS
DECLARE @ukupnoInsertanih int
DECLARE @ukupnoDeleteanih int
SELECT @ukupnoInsertanih = COUNT (*) FROM inserted
SELECT @ukupnoDeleteanih = COUNT (*) FROM deleted
PRINT @ukupnoInsertanih
PRINT @ukupnoDeleteanih
IF @ukupnoInsertanih >= 2 AND @ukupnoDeleteanih >= 2
BEGIN
INSERT INTO Zapisnik (Sadrzaj)
VALUES ('Promijenjeno je trajanje više kartica (' + CAST(@ukupnoInsertanih as nvarchar) + ')')
RETURN
END
ELSE IF @ukupnoInsertanih = 1 AND @ukupnoDeleteanih = 1
BEGIN
INSERT INTO Zapisnik (Sadrzaj)
SELECT 'Promijenjeno trajanje kartice pod rednim brojem ' + deleted.Broj +
'. Stara vrijednost trajanja je ' + CAST(deleted.IstekGodina as nvarchar) + '-' + CAST(deleted.IstekMjesec as nvarchar) +
' nova vrijednost trajanja je ' + CAST(inserted.IstekGodina as nvarchar) + '-' + CAST(inserted.IstekMjesec as nvarchar)
FROM inserted,deleted
RETURN
END
GO
UPDATE KreditnaKartica
SET Tip = 'Visa'
WHERE IDKreditnaKartica = 1 OR IDKreditnaKartica = 2 OR IDKreditnaKartica = 3 OR IDKreditnaKartica = 4
UPDATE KreditnaKartica
SET Tip = 'Visa', IstekGodina = '2030', IstekMjesec = '03'
WHERE IDKreditnaKartica = 4
SELECT * FROM KreditnaKartica
SELECT * FROM Zapisnik
---------------------- ISHOD 5--------------------
-- 1. zadatak
create table zapisnik
(
IDZapisnik int primary key identity,
Sadržaj nvarchar (max)
)
create trigger okidac1 on Komercijalist after insert, update, delete
as
declare @obrisano int
declare @umetnuto int
select @obrisano=IDKomercijalist
from deleted
select @umetnuto=IDKomercijalist
from inserted
if exists (select* from inserted) and not exists (select* from deleted)
begin
insert into Zapisnik
values ('Umetnut je Komercijalista s ID-em: ' + cast(@umetnuto as nvarchar(max)))
end
if exists (select* from deleted) and not exists (select* from inserted)
begin
insert into Zapisnik
values ('Obrisan je Komercijalista s ID-em: ' + cast(@obrisano as nvarchar(max)))
end
if exists (select* from deleted) and exists (select* from inserted)
begin
insert into Zapisnik
values ('Promijenjen je redak s ID-em: ' + cast(@obrisano as nvarchar(max)))
end
insert into Komercijalist (Ime, Prezime)
values ('Mirko','Mirkić')
update Komercijalist
set Ime='Špiro' where Prezime='Mirkić'
delete Komercijalist
where Prezime='Mirkić'
select*
from Zapisnik
drop table Zapisnik
drop trigger okidac1
-- 2. zadatak
create table osoba
(
IDOsoba int primary key identity,
Ime nvarchar(50),
Prezime nvarchar (50),
OIB nvarchar (11)
)
create trigger okidac2 on osoba after insert, update
as
declare @brojac int
select @brojac=len(OIB)
from inserted
if @brojac<>11
begin
insert into zapisnik
values ('Krivo unesena količina brojki u OIB!')
end
else if @brojac=11
begin
insert into zapisnik
values ('Uneseni OIB je valjan.')
end
insert into osoba
values ('Lara','Larić','1231231232')
select*
from zapisnik
drop table osoba
---------------------ISHOD 7.---------------------------
-- 5.
create proc zadatak5
@IDKupac int
as
delete from Stavka where RacunID in (select IDRacun from Racun where KupacID=@IDKupac)
delete from Racun where KupacID=@IDKupac
delete from Kupac where IDKupac=@IDKupac
go
begin try
begin tran
exec zadatak5 1
exec zadatak5 2
exec zadatak5 3
commit tran
print 'Brisanje je uspješno'
end try
begin catch
rollback
print 'Dogodila se greška' + error_message()
end catch
-- 6.
/*Prljavo- netočno čitanje pojam koji označava dohvaćanje podataka iz baze koji više ne postoji u bazi jer je bio dio
poništene transakcije
Konekcija1 Konekcija2
SET LOCK_TIMEOUT 4000SET LOCK_TIMEOUT 4000
1SET TRANSACTION ISOLATION LEVELSET TRANSACTION ISOLATION LEVEL
READ COMMITTEDREAD UNCOMITTED
BEGIN TRAN BEGIN TRAN
--------------------------------------------------------------------------
2UPDATE Osoba
SET Prezime =' '
WHERE IDosoba = 1
--------------------------------------------------------------------------
SELET Prezime
3FROM Osoba
WHERE IDOsoba = 1
----------------------------------------------------------------------------
4ROLLBACK TRAN
------------------------------------------------------------------------
5ROLLBACK TRAN
Prljava (netočna) čitanja se mogu dogoditi samo u slučaju ako konekcija koristi izolacijski nivo READ UNCOMMITTED, svi ostali
izolacijski nivoi sprječavaju pojavu ovakve vrste pogreške.*/
----------------oFantom (engl. phantom)---------------------
/*
Retci koji ne bi smjeli postojati, a svoje postojanje duguju nekoj drugoj transakciji
Konekcija1 Konekcija2
SET LOCK_TIMEOUT 4000SET LOCK_TIMEOUT 4000
1SET TRANSACTION ISOLATION LEVELSET TRANSACTION ISOLATION LEVEL
READ COMMITTEDREAD UNCOMITTED
BEGIN TRAN BEGIN TRAN
--------------------------------------------------------------------------
2UPDATE Osoba
SET Prezime = Prezime + 'nesto'
--------------------------------------------------------------------------
INSERT INTO Osoba
3VALUES (2, 'ime', 'prez')
COMMIT TRAN
----------------------------------------------------------------------------
4SELECT * FROM Osoba
------------------------------------------------------------------------
5ROLLBACK TRAN
U četvrtom koraku dolazi do nastanka fantomskog retka.
Riješenje je postavljanje izolacijskog nivoa transakcije na SERIALIZABLE, no na taj način srušiti konkurentnost
baze. Zato je najbolje taj problem najbolje rješavati dodatnim provjerama.
*/
-- Zad. 1
CREATE PROC Zad3I7 (@IDRacun int)
AS
DECLARE @IDRacuna int
DELETE FROM Racun WHERE Racun.IDRacun = @IDRacun
GO
EXEC Zad3I7 291
EXEC Zad3I7 290
EXEC Zad3I7 289
GO
-----------------
alter proc p3
@IDkomercijalist int
as
delete from Komercijalist where IDKomercijalist=@IDkomercijalist
go
BEGIN TRY
BEGIN TRAN
EXEC p3 275
EXEC p3 276
EXEC p3 277
COMMIT TRAN
PRINT 'Brisanje uspješno'
END TRY
BEGIN CATCH
ROLLBACK TRAN
PRINT 'Greška pri brisanju'
END CATCH
GO