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