Jump to content

Trigger instead of update - wie komme ich an die werte des Tabellenbefehls


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hi,

ich habe einen Trigger, der auf insert und update reagiert.

 

Wenn eine ID angegeben ist, soll diese gesucht werden und bei fund soll dieser datensatz geupdated werden. sonst gibts einen ganz neuen Datensatz mit der id.

 

klappt bei insert, bei update nur teilweise. Und zwar dahingehend, dass (was zwar logisch, aber hinderlich ist) bei einer id, die noch nicht vorhanden ist, keine daten im Inserted stehen.

 

Gibt es allgemein eine Möglichkeit, an die 'Roh'-Daten des Insert- oder Update-Befehls zu kommen?

 

Hier mal kurz mein bsp-Code.

 

tabelle testtabelle (id int, name char)

create trigger trGamesInsteadInsertUpdate on testtabelle
instead of insert, update as
begin
declare @new varchar(50)
declare @old varchar(50)
declare @id tinyint
declare @count tinyint
set @new = (select name from inserted);
set @id = (select id from inserted);
set @count = (select COUNT(*) from testtabelle where id = @id)
if(@count > 0) begin
	update testtabelle
	set name = @new
	where id = @id
	set @old = (select name from deleted);
end else begin
	insert into testtabelle values (@id, @new)
end
select @new, @old, @id
end

insert into testtabelle (id, name) values (
0,N'neu'
--Klappt

update testtabelle
set name = N'hehe'
where id =N'0'
--klappt auch


update testtabelle
set name = N'hehe'
where id =N'0'
--klappt nicht, da keine Änderung vollzogen worden wäre...
)

Link zu diesem Kommentar

Moin,

 

arbeite immer mengenbasiert, daher streiche mal alle Variablen.

Es kann keiner, einer, oder viele Sätze gleichzeitig eingefügt/updated werden, das ist immer zu berücksichtigen.

 

z.B. (ID ist hier eindeutig, IDENTITY (Autowert)):

 

Im INSERT Trigger:

 

INSERT INTO testtabelle (name)

SELECT name

FROM inserted

 

 

Im UPDATE Trigger:

 

UPDATE testtabelle

SET testtabelle.name = inserted.name,

testtabelle.Altername = deleted.name

FROM testtabelle

INNER JOIN inserted

ON testtabelle.id = inserted.id

INNER JOIN deleted

ON testtabelle.id = deleted.id

 

 

Gruß Kai

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...