Quantcast
Channel: Forum Getting started with SQL Server
Viewing all articles
Browse latest Browse all 7129

ajmo

$
0
0

--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

Viewing all articles
Browse latest Browse all 7129

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>