webForumDet fria alternativet

Transaktionsproblem, med en trigger

5 svar · 341 visningar · startad av erka

erkaMedlem sedan dec. 19996 522 inlägg
#1

Hej
Sitter å pluggar för en tenta på lördag och har hittat en uppgift på en typtenta som jag inte kan bli klok på, och ansvariglärare än inte anträffbar innan tentan (yihaa)

DDL-sattserna ser ut som nedan

create table student
(
spnr varchar(5) not null,
sname varchar(10),
sadress varchar(10),
stel varchar(10),
constraint STUDENT_PK PRIMARY KEY(spnr)
)

create table kurs
(
kkod varchar(5) not null,
kname varchar(10),
kadress varchar(10),
poang integer,
constraint KURS_PK PRIMARY KEY(kkod)
)

create table laser
(
id integer not null,
spnr varchar(5) not null,
kkod varchar(5) not null,
betyg integer,
constraint LASER_PK PRIMARY KEY(id),
constraint LASER_SPNR_FK FOREIGN KEY(spnr) REFERENCES student(spnr),
constraint LASER_KKOD_FK FOREIGN KEY(kkod) REFERENCES kurs(kkod))

create trigger t1 on kurs
for insert, update, delete
as
select i.kkod from inserted i, deleted d where i.kkod = d.kkod
commit

Sen får vi frågan, 1. Vad resulterar följande transaktion i för meddelande, server-outuput och eventuella felmeddelanden, finns det några fel i denna transaktion

begin transaction
	delete kurs
	insert into kurs values('K1','data1','lund','5')
	update kurs set kname = 'data'
	select @@trancount
	select @@trancount
	select * from kurs

För det första så är den felaktig för att det saknas ett commit i transaktionen, men det finns ju en i triggern spelar det någon roll? Sen när vi kör uppgiften får vi ingenting av server-output, det enda som händer är att det raderas alla ur Kurs tabellen.

Borde det inte ske följande

begin transaction
	delete kurs 
	--Här efter gör triggern en commit

	--Ny transaktion skapas automatiskt då det 
	--gör det vid en insert om man inte anger att en ska 
	--skapas och värdet kommer in
	insert into kurs values('K1','data1','lund','5')
	
	--Ny transaktion skapas automatiskt då det gör det 
	--vid en update om man inte anger att en ska skapas och värdet uppdateras
	update kurs set kname = 'data'

	--Skriver ut 0 då alla transaktioner är commitade, den 
	--första begin transaction commitas ju i triggern
	select @@trancount
	select @@trancount

	--Hämtar alla ifrån kurs, i detta fall endast den som 
	--sattes in med inserten ovan
	select * from kurs

Är det fel på min sql-server eller vad har jag inte förstått, för jag kan inte se varför inte inserten eller updaten körs

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Att använda commit i en trigger är ju helt begreppsvidrigt. MS rekommenderar att man låter bli men dom förbjuder det inte.

Det står följande för rollback

If a ROLLBACK TRANSACTION is issued in a trigger:

\* All data modifications made to that point in the current transaction are rolled back, including any made by the trigger.

\* The trigger continues executing any remaining statements after the ROLLBACK statement. If any of these statements modify data, the modifications are not rolled back. No nested triggers are fired by the execution of these remaining statements.

\* The statements in the batch after the statement that fired the trigger are not executed.

Den sista punkten verkar stämma med vad du upplever vid commit.

Jag letade efter motsvarande under commit men där står det inget.

erkaMedlem sedan dec. 19996 522 inlägg
#3

Tack för ditt svar. Har nu fått svar från vår handledare, att det skulle vi förstått, att det var begreppsvidrigt alltså. Trots det kommer 3 följdfrågor på informationen som skulle satts in i uppgift a

erkaMedlem sedan dec. 19996 522 inlägg
#4

LarsG, du har koll på det här, är det även begreppsvidrigt att ha en rollback i en trigger? isåfall varför

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Ja, det är det.

isåfall varför

Är det inte en kursuppgift? :)

erkaMedlem sedan dec. 19996 522 inlägg
#6

Nej faktiskt inte :) Tenta på lördag och således ingen uppgift utan mer att jag vill förstå allt inom tentan, och nej vi har ingen bok om triggers, det enda vi har är Elmasri - Navathes Fundamentals Of Database Systems, å där i hittar jag inget rollbacks i triggers där den tar upp triggers. På labbarna har vi fått uppgifter där vi ska ha skapat rollbacks i triggers, där av min förundran över upplägget på kursen jag läser nu.

Personligen gillar jag inte triggers för det är jobbigare å se inkappslad logik i databashanteraren än vad det är i kod, enda nyttan jag hitills sett med triggers i mina egna applikationer är nä det inte duger men check constraints, men den dagen kommer väll då jag ser nyttan med triggers ;)

129 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
125 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)