Lookup durch Trigger bei Insert

04/07/2008 - 15:35 von aka | Report spam
Hallo zusammen,

ich muß eine Datenbank von Firebird auf den SQL-Server 2005 umstemmen. Dabei
habe ich ein Problem mit einem Trigger, den ich einfach nicht hinbekomme.
Ich versuche, vor dem Insert von Daten in einer Tabelle mit folgendem
Trigger einen Wert aus einer anderen Tabelle zu ermitteln und diesen in
einem Feld der Tabelle zu setzen, in die ich Daten einfügen möchte. DB ist
Firebird2.1. Den Trigger kann ich nicht anlegen, FB sagt mir, daß ein
Subselect in diesem Kontext nicht möglich ist. Geht das generell nicht oder
mache ich etwas falsch?

Der Trigger sieht in Firebird folgendermaßen aus:

create trigger TR_BIU_PMATERIAL
before insert or update position 0
as
declare variable PID bigint;
begin
if (new.ID is null) then new.ID = next value for Seq_PMaterial_ID;
select ID from Produktion p
where (p.Anlage = new.Anlage)
and (p.Anfang < new.Zeit)
and (p.Ende > new.Zeit) into PID;
new.ProduktionID = PID;
end

Mein Versuch, diesen Trigger auf den SQL-Server umzusetzen:

CREATE TRIGGER [dbo].[TRIU_PMaterial] ON [dbo].[PMaterial]
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE
AS
BEGIN
declare @vProduktionID bigint
declare @vAnlage INTEGER
declare @vAnfang datetime
declare @vEnde datetime

select @vAnlage = inserted.Anlage from inserted
select @vAnfang = inserted.Anfang from inserted
select @vEnde = inserted.Ende from inserted

select @vProduktionID = Produktion.ID
from Produktion
where ((Produktion.Anlage = @vAnlage) and
(Produktion.Anfang < @vAnfang) and
(Produktion.Ende >= @vEnde))

inserted.PID = @vProduktionID
END
GO

erzeugt die Fehlermeldung: "Falsche Syntax in der Nàhe von inserted".
Was kann der SQL-Server hier nicht, was eine OpenSource-DB locker bringt?
Oder was mache ich mangels Erfahrung mit dem SQL-Server falsch?


Danke & Gruß,
André
 

Lesen sie die antworten

#1 Jürgen Volke
04/07/2008 - 15:39 | Warnen spam
Hallo André

Mein Versuch, diesen Trigger auf den SQL-Server umzusetzen:

CREATE TRIGGER [dbo].[TRIU_PMaterial] ON [dbo].[PMaterial]
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE
AS
BEGIN
declare @vProduktionID bigint
declare @vAnlage INTEGER
declare @vAnfang datetime
declare @vEnde datetime

select @vAnlage = inserted.Anlage from inserted
select @vAnfang = inserted.Anfang from inserted
select @vEnde = inserted.Ende from inserted

select @vProduktionID = Produktion.ID
from Produktion
where ((Produktion.Anlage = @vAnlage) and
(Produktion.Anfang < @vAnfang) and
(Produktion.Ende >= @vEnde))



inserted.PID = @vProduktionID
END
GO

erzeugt die Fehlermeldung: "Falsche Syntax in der Nàhe von inserted".



Gruß Jürgen

Ähnliche fragen