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
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.
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
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 ;)
134 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe