SQL Server - wyzwalacze

0

Cześć,

Wiecie może dlaczego po wykonaniu

 insert into tab values(10,2,3);

pojawia się komunikat :

Msg 3609, Level 16, State 1, Line 2
The transaction ended in the trigger. The batch has been aborted.

Co należy zrobić aby go pominąć / niewyświetlać ?

Create Table tab(
	t decimal(10,0),
	o int,
	k varchar
);

create table dane(id decimal(10,0));
insert into dane values(1);

IF OBJECT_ID ('napis', 'TR') IS NOT NULL
   DROP TRIGGER napis;
GO
CREATE TRIGGER napis
ON tab
AFTER INSERT, UPDATE
AS
DECLARE @zmienna decimal(10,0) 
SELECT @zmienna = t from inserted

IF @zmienna not in (select id from dane)
BEGIN
	raiserror('to se neda', 16,1);		
	ROLLBACK TRANSACTION ;		
END
GO
0

Nie lepiej zamiast takiego triggera zwykły foreign key?

0

To co faktycznie chciałbym zrobić nie mogłoby wykorzystywać klucza obcego.
W swoim pytaniu przedstawiłem jedynie przykład przedstawiąjacy to z czym mam problem.

0

Raczej trigger "after" musi wywalić błąd bo inaczej wstawi krotkę a jak rozumiem chcesz tego uniknąć. Musisz szukać czegoś innego np. INSTEAD OF albo procedura.

0

po pierwsze primo to zawsze pamietaj ze trigger w mssql operuje na inserted gdzie moze byc wiecej niz 1 rekord

 
create triger trgNapis
on Tab 
after insert, update
as begin
  set nocount on;

  if exists(
    select i.t from inserted i 
    except
    select d.Id from dane d
  ) begin
    raiseerror('to se neda', 16, 1)
    if XACT_STATE() = ... --poczytaj o XACT_STATE()
       rollback, commit -- co chcesz
  end;
go

1 użytkowników online, w tym zalogowanych: 0, gości: 1