--            SQL alapok

-- biblio adatbázis (SQL serveren:  pubs_access)

-- 193.6.41.253 login: diak/diak

/ select top 1 * from publishers

/ select * from publishers where city = 'New York'

/ select name from publishers where city = 'New York'

/ select getdate()

--a New York-i székhelyű kiadók neve

--a legnaqyobb születési év
/ select * from authors where [year born] in (select max([year born]) from authors)


-- a legfiatalabb szerző neve
select * from authors
where [year born] in (select max([year born]) from authors)

--New Yorkban kiadott könyvek címe

/ select title, name from publishers p inner join

      titles t on p.pubid=t.pubid where city = 'New York' 

select t.title, [Company Name], city, p.pubid
from publishers p inner join titles t on p.pubid=t.pubid
where city='New York'

--Bramer, Susan által is írt, New Yorkban kiadott könyvek címe
select t.title, [Company Name], city, p.pubid --ha it nem lenne p alias, hiba lenne
from publishers p inner join titles t on p.pubid=t.pubid
where city='New York' and t.isbn in
    (select isbn
    from titleauthor ta inner join authors a on ta.au_id=a.au_id
    where a.author like 'Bramer, Susan%')

--ugyanez máshogy
select distinct t.title, [Company Name], city, p.pubid
from publishers p
    inner join titles t on p.pubid=t.pubid
    inner join titleauthor ta on ta.isbn=t.isbn
    inner join authors a on ta.au_id=a.au_id
where city='New York' and a.author like 'Bramer%'

select count(*) from publishers --730 db
--melyik kiadónak nem jelent meg könyve? --21 db
select * --, [Company Name], city, p.pubid
from publishers p left outer join titles t on p.pubid=t.pubid
where t.isbn is null
order by p.pubid

-- NORTHWIND ADATBÁZISRA ÁTÁLLÁS
--ki hany uzletet kotott?

select e.lastname, count(orderid) as rend_szama
--count(*) kihozott volna Lamernek is egy rendelést
from employees e left outer join orders o on
--from employees e inner join orders o on
e.employeeid = o.employeeid
group by e.employeeid, e.lastname
order by count(orderid) desc

--ki nem kötött még üzletet?
select e.*
from employees e left outer join orders o on
e.employeeid = o.employeeid
where o.orderid is null

--ki kinek a főnöke? (Northwind) (3 szintig)
select dolg.lastname as dolg_neve, fonok.lastname as fonok_neve,
nagyfonok.lastname as nagyfonok_neve
from employees dolg left outer join employees fonok
on dolg.reportsto=fonok.employeeid
left outer join employees nagyfonok
on fonok.reportsto=nagyfonok.employeeid

select year(getdate())

--megrendelések főösszege, melyik a legértékesebb rendelés?
select o.orderid as rend_szama,
    cast(o.orderdate as varchar(50)) as rend_datuma,
    str(sum((1-discount)*unitprice*quantity), 15, 2) as rend_osszege,
    sum(quantity) as darabok_szama,
    count(d.orderid) as tetelek_szama
from orders o inner join [order details] d on o.orderid=d.orderid
group by o.orderid, o.orderdate
--order by o.orderdate
order by sum((1-discount)*unitprice*quantity) desc

--ido szerinti rendezéskor: group by o.orderid, o.orderdate

--melyik ügynök hozta a legtöbb pénzt? Hány rendelésbol?

select  u.titleofcourtesy+' '+u.lastname+' '+ u.firstname +' ('+u.title +')'  as nev,
--select u.lastname as nev,
str(sum((1-discount)*unitprice*quantity), 15, 2) as behozott_penz,
count(o.orderid) as rendelesek_szama
from orders o inner join [order details] d on o.orderid=d.orderid
    inner join employees u on u.employeeid=o.employeeid
group by u.employeeid, u.titleofcourtesy, u.title, u.lastname, u.firstname
--megfigyelni: emp.id szerint is kell group, bár nem érdekel minket, mert
--lehetnek azonos nevu ügynökök
--having count(o.orderid)>200 --ha csak a 200-nál több megrendelésu ügynökök érdekelnek
order by sum((1-discount)*unitprice*quantity) desc

--gyanú: csak 9 ügynökünk van?

select count(*) from employees

--látszik, hogy 10!
--akkor ki nem kötött egy üzletet sem?
--az ügynöklista alján 0-val szerepeljenek azok is, akikhez nincs rendelés

select  u.titleofcourtesy+' '+u.lastname+' '+ u.firstname +' ('+u.title +')'  as nev,
isnull(str(sum((1-discount)*unitprice*quantity), 15, 2), 0) as behozott_penz,
count(o.orderid) as rendelesek_szama
from employees u left outer join
    (orders o inner join [order details] d on o.orderid=d.orderid)
on u.employeeid=o.employeeid
--where u.titleofcourtesy='Mr.' --ha csak a férfiak érdekelnek
group by u.employeeid, u.titleofcourtesy, u.title, u.lastname, u.firstname
order by sum((1-discount)*unitprice*quantity) desc

--lebukott.

--melyik a legkeresettebb termék?
select p.productid, p.productname, count(*) as hanyszor_szerepel,
    sum(quantity) as ossz_darabszam
from products p left outer join [order details] d on p.productid=d.productid
group by p.productid, p.productname
order by count(*) desc

--melyik ügynök adta el a legtöbbet a legkeresettebb termékbol?
--elso valtozat
select u.titleofcourtesy+' '+u.lastname+' '+ u.firstname +' ('+u.title +')'  as nev,
    sum(quantity) as hanyat_adott_el
from orders o inner join [order details] d on o.orderid=d.orderid
    inner join employees u on u.employeeid=o.employeeid
where d.productid = 59 --már tudjuk, hogy ez a nyerő termék
group by u.employeeid, u.titleofcourtesy, u.title, u.lastname, u.firstname
order by sum(quantity) desc

--s végül:
--melyik ügynök adta el a legtöbbet a legkeresettebb termékbol és mi az?
--ezt mindenki önállóan csinálja meg!!

select top 1 u.titleofcourtesy+' '+u.lastname+' '+ u.firstname +' ('+u.title +')'  as nev,
    sum(quantity) as hanyat_adott_el
    ,pr.productname as mibol
from orders o inner join [order details] d on o.orderid=d.orderid
    inner join employees u on u.employeeid=o.employeeid
    inner join products pr on pr.productid=d.productid
where d.productid =
    (select top 1 p.productid
    from products p left outer join [order details] d on p.productid=d.productid
    group by p.productid, p.productname
    order by count(*) desc)
group by u.employeeid, u.titleofcourtesy, u.title, u.lastname, u.firstname
, pr.productname  --ha látni akarjuk azt is, hogy mi a legkeresettebb termék
        --nem okozhat hibát, mert a where elobb szűr, mint a group
order by sum(quantity) desc

--szorgalmi SELECT feladatok:
--a legjobb üzletkötő milyen termékből adott el a legtöbbet?

--a havonta kötött üzletek száma üzletkötőnként és havonként

select e.employeeid, lastname, cast(year(orderdate) as varchar(4)) +'_'+  cast(month(orderdate) as char(2)) as honap, count(orderid) as rend_szam
from employees e left outer join orders o on e.employeeid=o.employeeid
group by e.employeeid, lastname, cast(year(orderdate) as varchar(4)) +'_'+  cast(month(orderdate) as char(2))
order by lastname, honap

--a havonta átlagosan kötött üzletek száma üzletkötőnként, ki a legjobb?

drop table #tt

select e.employeeid, lastname, cast(year(orderdate) as varchar(4)) +'_'+  cast(month(orderdate) as char(2)) as honap, count(orderid) as rend_szam
into #tt
from employees e left outer join orders o on e.employeeid=o.employeeid
group by e.employeeid, lastname, cast(year(orderdate) as varchar(4)) +'_'+  cast(month(orderdate) as char(2))
order by lastname, honap

select * from #tt

select lastname, avg(rend_szam) as atlagos_rend_szam
from #tt group by employeeid, lastname
order by atlagos_rend_szam desc

--átlagosan hány rendelést köt nálunk egy ügynök?--erre már temp.tábla kell.

--ki produkált legalább másfélszer akkora bevételt, mint a főnöke?

--            Gyakorlatok adatbázis-objektumokkal

--Enterprise manager indítása, belépés diak* néven
--jelszó megváltoztatása
--a stupido2000.mdb tábláinak importálása az abkr-admin könyvtárból az adatbázisba
--kulcsok, külső kulcsok helyreállítása a diagramszerkesztővel
--kulcs, külső kulcs kényszerek ellenőrzése a tábla szerkesztésekor
--kényszer elhelyezése az egyenleg mezőre (>=0) és a dátum mezőre (<getdate())
--ennek tesztelése a Query Analyzerrel (hibát akarunk kiváltani)

--        eddig jutottunk el az okt. 5-i órán

--update, delete, insert szintaxisa, kipróbálása a saját adatbázisban

update vásárló set egyenleg=0  where városnév like 'H%'

--update from: új irszám mező felvétele a vásárló táblába,
--kitöltése a Város táblából

update vásárló set irszám='ismeretlen'
select * from vásárló

--külön figyelmet érdemel az "update from" --egyik táblából a másikba átírni valamilyen
--információt

update vásárló set irszám=vs.irszám
from vásárló v inner join város vs on v.városnév=vs.városnév

--insert

insert vásárló (vásárlónév, városnév, egyenleg)
values ('próba', 'Lukafa', 25)

--masolat keszizese a Vásárló tábláról, eredeti törlése majd visszaállítása
--ideiglenes táblák haszna és használata, select ... into

select * into t2 from vásárló
delete vásárló
insert vásárló select * from t2

--a visszaállításkor mindenki egyenlege 0 legyen
--ehhez kell: konstans a select listában
--példa:
select vásárlónév, 5 as konstans , getdate() from vásárló

--tehát: a visszaállításkor mindenki egyenlege 0 legyen

delete vásárló
insert  vásárló select Vásárlónév, városnév, 0, null from t2
select * from vásárló

--"show execution plan" a Query Analyzerben a legbonyolultabb lekérdezésre
--    (melyik ügynök adta el a legtöbbet a legkeresettebb termékbol)
-- megfigyelni: a szűrések a fa leveleinél vannak, hogy az adatszerkezetek kicsik legyenek


--            DDL
--create table gyakorlása

create table proba (id int not null, nev varchar(51))
insert proba values (5, 'név')
select * from proba

--view készítése: leghűségesebb vásárlónk kedvenc szállítója (kézzel)

create view vi_vasarlo as
select distinct vásárlónév + ' ' + városnév as vnev from vásárló

--megfigyelni: distinct hatása (ha csak vásárlónév lenne)

select * from vi_vasarlo



--                T-SQL gyakorlatok



--T-SQl változók: @i
--T-SQL vezérlési szerkezetek: if, while
--scriptek elemei (pl. print)

--pelda ciklusra: adjuk ossze a szamokat 1-tol n-ig
set nocount on
declare @i int, @eredm int
set @i=1
set @eredm=0
while @i<=23 begin
    set @eredm=@eredm+@i
    set @i=@i+1
end

select 'a számok összege: '+cast(@eredm as varchar(15))
print 'a számok összege: '+cast(@eredm as varchar(15))
select @eredm
select 'eredmény'
go
select rand()
--megjegyzes: Hungarian notation

--feladat: 1. egy uj tábla létrehozása, 2. 100 véletlen float értékkel feltöltése
--3. listázása és 4. törlése
--"generate SQL script" egy bonyolult Northwind táblára, külső kulccsal,indexekkel
--új anyag: if exists

declare @i int
--if exists: haladóknak
if exists (select * from dbo.sysobjects
        where id = object_id('[dbo].[veletlen]')
        and OBJECTPROPERTY(id, 'IsUserTable') = 1)
    drop table [dbo].[veletlen]

create table veletlen (szam float)
set @i=1
while @i<=100 begin
    insert veletlen (szam) values (100*rand())
    set @i=@i+1
end
select * from veletlen
drop table veletlen

--eddig jutottunk okt. 12-én

--                tarolt eljarasok

create procedure t2
@i int
as print 2*@i
go
t2 12


create procedure sp_veletlen
@hany_szam int
as
declare @i int
--if exists: haladóknak
if exists (select * from dbo.sysobjects
        where id = object_id('[dbo].[veletlen]')
        and OBJECTPROPERTY(id, 'IsUserTable') = 1)
    drop table [dbo].[veletlen]

create table veletlen (szam float)
set @i=1
while @i<=@hany_szam begin
    insert veletlen (szam) values (100*rand())
    set @i=@i+1
end
select * from veletlen
drop table veletlen

go

exec sp_veletlen 250

--pelda kurzorra: rekord-mezo atalakitas (tranzakcionális alakra hozás)
--figyelem: use
use northwind
select * from employees
declare @emp_id int, @emp_name nvarchar(50), @i int, @address nvarchar(60),
    @city nvarchar(50)
create table #eredm (adatid int, dolg_id int,
        adatnev varchar(50), adatertek nvarchar(100))
declare cursor1 cursor
    for
    select employeeid as emp_id, firstname+' '+lastname as emp_name,address, city
    from employees

set @i=0
open cursor1
fetch next from cursor1 into @emp_id, @emp_name, @address, @city
while @@fetch_status = 0
begin
    --print @emp_id print @emp_name print @i
    if @emp_name is not null begin
        insert #eredm values(@i, @emp_id, 'dolgozo_neve', @emp_name)
        set @i=@i+1
    end
    if @address is not null begin
        insert #eredm values(@i, @emp_id, 'dolgozo_cime', @address)
        set @i=@i+1
    end
    if @city is not null  begin
        insert #eredm values(@i, @emp_id, 'dolgozo_varosa', @city)
        set @i=@i+1
    end
    fetch next from cursor1 into @emp_id, @emp_name, @address, @city

    print @emp_id
end
close cursor1
deallocate cursor1
print 'feldolgozás vége'
select * from #eredm
drop table #eredm
GO

--EXEC master.dbo.sp_cursor_list 'cursor1'

--feladat:
--kurzort írni az Orders/Order details táblákra: a 100$ alatti rendeléseket külön táblába írni
--ezt meg lehetne csinálni egy select mondattal is de most a kurzort gyakoroljuk

--problema: nincs jogunk a northwind-ben tablat letrehozni
--megoldas: masik adatb. egy tablajanak az elerese az osveny segitsegevel
select top 10  * from northwind.dbo.orders

--egyik tarolt aljaras hivasa egy masikbol,
--OUTPUT parameterek hasznalata

alter procedure sp_veletlen
@hany_szam int
as
declare @i int, @k float, @k2 float
--if exists: haladóknak
if exists (select * from dbo.sysobjects
        where id = object_id('[dbo].[veletlen]')
        and OBJECTPROPERTY(id, 'IsUserTable') = 1)
    drop table [dbo].[veletlen]

create table veletlen (szam float)
set @i=1
while @i<=@hany_szam begin
    set @k=    100*rand()
    exec sp_ketszerez @k, @eredm=@k2 output
    insert veletlen (szam) values (@k2)
    set @i=@i+1
end
select * from veletlen
drop table veletlen

create  procedure sp_ketszerez
@be float,
@eredm float output
as
set @eredm=2*@be
go

sp_veletlen 100


--                Tranzakciók

        --batch (köteg) két GO utasítás között

--T-SQL változók csak a kötegen belül érvényesek
--DDL, pl alter table hatása csak a GO után érezheto
--egy script több köteget is tartalmazhat: ha valamelyikben hiba van, veszi a következot


--drop table pelda
create table pelda (szam int)
insert pelda values (44)
go

--1. kiserlet
update pelda set szam=22
go
selec * from pelda --szintaktikai hiba
go
select * from pelda
--eredmeny 22, mert az elso batch sikerult

--ugyanez egy batch-ben
delete pelda
insert pelda values (44)
go

--2. kiserlet
update pelda set szam=22
selec * from pelda --szintaktikai hiba
go
select * from pelda
--eredmeny 44
--mert szintaktikai hiba esetén az egész batchból semmi sem hajtódik végre

--DE!
--ha az objektumnev hianyzik (nem parse hiba), akkor nem szamit a batch:
delete pelda
insert pelda values (44)
go

--3. kiserlet
update pelda set szam=22
select * from plda --Invalid object name
go
select * from pelda
--eredmeny 22
go
--PEDIG MIND A KÉTSZER CSAK EGY BETUT HAGYTUNK KI!

--ACID tulajdonságok
    --atomicity: nem valósulhat meg részlegesen
    --consistency: utána konzisztens állapotban marad az AB (pl. kenyszerek teljesulnek)
    --isolation: párhizamosan futó tr.ók nem látják egymást (szintjei vannak)
    --durability: a logolás miatt a commit után, ha a commit csak a
    --    memóriában történt meg a rendszerhibakor,
    --    akkor is kiíródik az új adat file-ba a következo induláskor
    --    log (ldf) tartalma: logikai uatsítás, before/after image (nagyobb lehet, mint az ab.)
        

                --autocommit tranzakció

--drop table pelda2
--drop table pelda3
set nocount on
create table pelda2 (id int not null, szam int)
insert pelda2 values (0, 44)
insert pelda2 values (1, 44)
insert pelda2 values (2, 44)
create table pelda3 (id int not null, pelda2_id int)
insert pelda3 values (1, 1)
insert pelda3 values (2, 1)
--külső kulcs kényszer a kettő közé:
alter table pelda2 add constraint pk_1 primary key (id)
alter table pelda3 add constraint pk_2 primary key (id)
alter table pelda3 add constraint fk_1 foreign key  (pelda2_id)  references pelda2 (id)

go

declare @hibakod int
delete pelda2 --ez annyi logikai törlés, ahány rekordja van
-- nem törli az 1. es 3. rekordot, mert a 2. törlésekor hiba volt!!

--    HIBAKEZELÉS
set @hibakod=@@error
if @hibakod <> 0 print 'HIBA! hibakód: '+cast(@hibakod as varchar(10))

--megjegyzés:
--if @@error <> 0 print 'HIBA! hibakód: '+cast(@@error as varchar(10))
--ez nem muködne, mert az if utasítás nem volt hibás...

select * from pelda2
go
--mindharom rekord megvan


        -- "igazi", azaz explicit tranzakciók

set xact_abort off
--begin tran, commit tran, rollback tran
begin tran
print @@trancount
--itt egy hiba:
delete from pelda2
--commit tran
--elfeljtjük a commit-ot...
go
--ezután VIGYÁZAT:
print @@trancount
-- 1, tehát besült a tr. (igen nagy hiba lehet belole!!)
--megoldás kézzel:
rollback tran
print @@trancount
-- most már 0

go

--ehelyett használd az xact_abortot
set xact_abort on     --     " Specifies whether Microsoft® SQL Server™ automatically rolls back the
            --    current transaction if a Transact-SQL statement raises a run-time error"
            --vagy minden insert, cast, update, delete stb. után a @@error vizsgálata
--go
begin tran
print 'eloször: ' + cast(@@trancount as varchar)
--itt egy hiba:
delete from pelda2
--ezért ide már nem jut el:
commit tran
go
                            --if @@trancount>0 rollback tran
--ezután:
print 'végül: ' + cast(@@trancount as varchar)
-- ez 0

--feladat: 3 insert utasítással demonstrálni a tr. rollback-ot, a hiba a 2.-nál legyen
set nocount on
--drop table t2
--drop table t1
go
CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO
print 'eloször: ' + cast(@@trancount as varchar)

SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO
print 'végén: ' + cast(@@trancount as varchar)

/* Select shows only keys 1 and 3 added.
   Key 2 insert failed and was rolled back, but
   XACT_ABORT was OFF and rest of transaction
   succeeded.
   Key 5 insert error with XACT_ABORT ON caused
   all of the second transaction to roll back. */

SELECT *
FROM t2
GO

--zarak szintjei:
--    rekord
--    lap (4KB)
--    kulcs
--    index
--    tabla
--    adatb.

--zarak tipusai:
--    shared (read)
--    exlusive (write)
--    update (shared->excl)
--    (intent)

--izolacios szintek:
--    serializable
--    repeatable read
--    read committed
--    read uncommitted

--tranzakciő izolációs szintek demonstrációja
create table termek(id int primary key, eladva varchar(50))
insert termek(id, eladva) values (1, 'nincs eladva')
insert termek(id, eladva) values (2, 'nincs eladva')
select * from termek
update termek set eladva='nincs eladva' where id=2
go
set tran isolation level read committed --ez a default
go
begin tran
declare @eladva varchar(50)
select @eladva=eladva from termek where id=2 -- vizsgalat
waitfor delay '00:00:10' --most terheljük az illető bankszámláját
if @eladva='nincs eladva' begin
    update termek set eladva='eladva' where id=2
    print 'eladás megtörtént'
end else print 'eladás sikertelen'
commit tran
go

--egy masik kapcsolatot nyitni, ezzel a koddal:
--set tran isolation level read committed --ez a default
--set tran isolation level repeatable read
set tran isolation level serializable
go
begin tran
declare @eladva varchar(50)
select @eladva=eladva from termek where id=2 -- vizsgalat
waitfor delay '00:00:05' --most terheljük az illető bankszámláját
if @eladva='nincs eladva' begin
    update termek set eladva='lefoglalózva' where id=2
    print 'eladás megtörtént'
end else print 'eladás sikertelen'
commit tran
go
--a ket kodot egyszerre elinditani
select * from termek --eredmeny: eladva vagy lefoglalozva attol fuggoen, hogy melyik indult hamarabb
update termek set eladva='nincs eladva' where id=2

--ez az izoláciős elképzelésünket sérti: mindkét tr. azt hiszi, hogy csak o adta el a 2. terméket!!!
--(logikai hiba)
--és ez a default!
--VISZONT: mindkét tr. csak 10 s-ig futott... (nem álltak be egymás mögé)

--ugyanez repeatable read esetén
--eredmeny:
Transaction (Process ID 53) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
--mivel mindketto kert egy shared lock-ot, es egyik sem tudta ezt exclusive-ve atalakitani...
--futasidok: 16 ill. 12 s (2 s-ig vart a szerver, hatha feloldodik a deadlock magatol...)
--nincs logikai hiba, csak egy eladas tortent

--ennek a helyzetnek nincs megoldasa (pech): a ket muvelet koze ne tegyunk delay-t...

--ellenorzes:  eygikbol kiszedni a vizsgalatot es kesleltetest, csak update maradjon
--ekkor nem lesz deadlock, es csak egyszer adjuk el.

-- ESETTANULMÁNY: repjegyes példa, demo (csak egy embernek sikerülhet)
delete jegy

-- rep.jegy foglalas, SQL tranzakcios gyakorlat
-- 2001 szept., Vassanyi Istvan
set transaction isolation level serializable
set xact_abort on
set nocount on
declare @jszam int, @jid int, @pid int, @utnapja datetime, @napikod smallint
declare @pnev varchar(50), @ind varchar(50), @cel varchar(50)
declare @jegyar money, @egyenleg money, @helyszam smallint

set @jszam=637 set @utnapja='2001.10.23' set @napikod=2 set @pid=2--ezek a parameterek a kliens programbol jonnek
                    --feltesszuk, hogy letezo rekordokra utalnak /ezt kulonben vizsgalni kellene/
select @ind=IndAll, @cel=CelAll from JaratTA where Jszam=@jszam
select @pnev=Pnev from Partner where PID=@pid
print 'Jegyfoglalás és -vétel ' + @pnev + ' számára ' + @ind + '-' + @cel + ' viszonylatban.'
print 'Tranzakció indítása...'
begin transaction
                --van-e eleg penze
select @egyenleg=Egyenleg from Partner where PID=@pid
select @jegyar=Jegyar from JaratTA where Jszam=@jszam
if @egyenleg < @jegyar begin  
    raiserror('A tranzakció sikertelen. A hiba oka: nincs fedezet.', 17,17)
    rollback transaction
    goto vege
end
                --van-e hely
select @jid=JID, @helyszam=HelySzam from Jarat where Jszam=@jszam and UtNapja=@utnapja and NapiKod=@napikod
if @helyszam <= 0 begin
    raiserror('A tranzakció sikertelen. A hiba oka: nincs hely.', 17,17)
    rollback transaction
    goto vege
end
                --van-e mar jegye
if exists (select * from Jegy where PID=@pid and JID=@jid) begin
    raiserror('A tranzakció sikertelen. A hiba oka: a partnernek erre a járatra van már jegye.', 17,17)
    rollback transaction
    goto vege
end
waitfor delay '00:00:01'
                --tranz. OK
update Partner set Egyenleg=Egyenleg-@jegyar where PID=@pid
update Jarat set Helyszam=Helyszam-1 where JID=@jid
insert Jegy (PID, JID) values (@pid, @jid)
print 'A tranzakció sikeres.'
commit transaction

vege:  --visszateres

go

--teszt: set transaction isolation level serializable hatása: tovább tart a (sok) tranzakció


--ami meg nem volt:
--backup/restore
--jobok
--triggerek