SQL Server - wyzwalacze

Odpowiedz Nowy wątek
2013-07-24 20:42

Rejestracja: 8 lat temu

Ostatnio: 2 lata temu

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
edytowany 1x, ostatnio: skolukmar, 2013-07-24 20:42

Pozostało 580 znaków

2013-07-24 22:15

Rejestracja: 13 lat temu

Ostatnio: 9 godzin temu

0

Nie lepiej zamiast takiego triggera zwykły foreign key?

Pozostało 580 znaków

2013-07-24 22:21

Rejestracja: 8 lat temu

Ostatnio: 2 lata temu

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.

Pozostało 580 znaków

2013-07-24 22:23

Rejestracja: 9 lat temu

Ostatnio: 5 lat temu

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.

Pozostało 580 znaków

2013-08-03 08:59

Rejestracja: 13 lat temu

Ostatnio: 3 lata temu

Lokalizacja: Poznań

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

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance

Pozostało 580 znaków

Odpowiedz

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