Hej Använd funktionen TRIGGER_NESTLEVEL() för att se om triggern har triggats av den första triggern (mycket triggers där...) Ett litet snabbhackat exempel som nog kommer att förklara ganska tydligt:hjälp med trigger...
Jag har två tabeller; MainTable och SecTable. När det görs en insert i SecTable räknas ett värde ner i MainTable. Likaså räknas värdet upp när det görs en delete i SecTable. När det ned värdet räknats ner till noll vill jag omöjliggöra en insert eller rättare sagt vill jag skicka ett felmeddelnade. Så långt är allt okej, men grejen är att det görs ju ändå en insert i SecTable, trots att nedräkningen inte utförs. Jag inser möjligheten att göra en delete på det nya värdet, men då triggas min delete-trigger och då ökas värdet i min mainTable. Det blir alltså också fel.
Vad kan man göra? Kan man göra en rollback på inserten som skedde innan triggern utförs? (jag har ingen sp till detta utan det sker via ado)
Så här ser triggern ut nu:
CREATE TRIGGER SecTableInsert ON [dbo].[SecTable]
FOR INSERT
AS
DECLARE
@antalRader int,
@fel varchar(255),
@felNummer int,
@lediga int,
@secID int
BEGIN
SELECT @antalRader = @@rowcount
SELECT @lediga = MainTable.Lediga FROM MainTable
IF @lediga < @antalRader BEGIN
SELECT @felNummer = 13000
SELECT @fel = 'Error! Licenserna är slut.'
raiserror @felNummer @fel
END
ELSE
BEGIN
UPDATE MainTable SET Lediga = Lediga-@antalRader
FROM inserted, MainTable
WHERE MainTable.MainID = inserted.MainID
END
RETURN
errorHandler:
RAISERROR @felNummer @fel
END
Tack på förhand!
/PeterSv: hjälp med trigger...
create table foobar (a int, b int)
go
create table barfoo (allowed int)
go
insert into barfoo values (5)
go
CREATE TRIGGER foobar_insert
ON foobar
FOR INSERT
AS
BEGIN
DECLARE @num int, @allowed int
SELECT @num = @@rowcount
SELECT @allowed = allowed FROM barfoo
IF @allowed < @num
BEGIN
DELETE foobar
FROM inserted
WHERE foobar.a = inserted.a
END
ELSE
BEGIN
UPDATE barfoo SET allowed = allowed-@num
END
END
GO
CREATE TRIGGER foobar_delete
ON foobar
FOR DELETE
AS
BEGIN
DECLARE @nestlevel int, @num int
SELECT @nestlevel = TRIGGER_NESTLEVEL()
SELECT @num = @@rowcount
IF @nestlevel > 1
BEGIN
PRINT 'Kilroy was here...'
END
ELSE
BEGIN
UPDATE barfoo SET allowed = allowed+@num
END
END
GO
/* Ta bort kommentarerna för att testa triggrarna med nedanstående kod
select * from foobar
select * from barfoo
insert into foobar values (1,1)
insert into foobar values (2,1)
insert into foobar values (3,1)
insert into foobar values (4,1)
insert into foobar values (5,1)
select * from foobar
select * from barfoo
insert into foobar values (6,1)
select * from foobar
select * from barfoo
delete from foobar where a = 1
select * from foobar
select * from barfoo
*/