MSDE 2000: Feldinhalt in Trigger festlegen. Wie?
-
Hallo!
Ich möchte, dass ein Feld sozusagen einen Autowert hat. Es soll immer hochzählen.
Ich kann es aber nicht als ID machen, weil dann meine eigentliche ID nicht mehr funktioniert.Jetzt versuche ich nen Trigger zu machen, aber ich kriege das nicht dem Feld zugewiesen.
CREATE TRIGGER [trLfdnr] ON [dbo].[Lager] FOR INSERT AS DECLARE @nr int select @nr = (Select Max(lfdNr) from [dbo].[HG_Lager]) +1 select inserted.LfdNr = @nr Return
Die vorletzte Zeile mag er nicht.
-
Ich möchte, dass ein Feld sozusagen einen Autowert hat. Es soll immer hochzählen.
select inserted.LfdNr = @nr
Mir ist nicht ganz klar, was du damit machen möchtest.
FUNCTIONs können Werte zurückgeben. Wenn's hilft: Ruf (im Trigger) einfach eine Funktion auf, die dir den gewünschten Wert zurückliefert und dann mit UPDATE oder INSERT diesen Wert in die Tabelle speichern.
Vielleicht noch SET: SET @nr = @nr + 1
MfG
-
Ah, danke.
Das mit dem select (statt SET) stand so in den doofen Buch. Ich war so froh, überhaupt was in der Art gefunden zu haben.
Das mit dem Updaten mache ich jetzt auch.
-
mit UPDATE diesen Wert in die Tabelle INSERTen oder UPDATEen.
Ich habe noch ein paar Trigger/Function/Procedure Beispiele aus der DB Vorlesung. Wenn du möchtest, dann kann ich dir ein paar posten.
-
Oh ja, bitte bitte!
*aufdiekniefall*
-
CREATE PROCEDURE erhoehe_mittel(prozent INT DEFAULT 10) UPDATE projekt SET mittel = mittel + (mittel*prozent/100); END PROCEDURE; CREATE PROCEDURE aendere_pers_nr (alte_nr INT, neue_nr INT) UPDATE mitarbeiter SET m_nr = neue_nr WHERE m_nr = alte_nr; UPDATE arbeiten SET m_nr = neue_nr WHERE m_nr = alte_nr; END PROCEDURE; EXECUTE PROCEDURE aendere_pers_nr (10102, 10103);
CREATE FUNCTION loesche_mitarb(pers_nr INT) RETURNING INT,INT DEFINE zaehler INT; SELECT COUNT(*) INTO zaehler FROM arbeiten WHERE m_nr = pers_nr; DELETE FROM mitarbeiter WHERE m_nr = pers_nr; DELETE FROM arbeiten WHERE m_nr = pers_nr; RETURN pers_nr, zaehler; END FUNCTION; EXECUTE FUNCTION loesche_mitarb(10103) CREATE FUNCTION TOPn(rang INT) RETURNING INT, CHAR(4), DECIMAL(8,2); DEFINE i, j INT; DEFINE name CHAR(20); DEFINE summe DECIMAL (8,2); FOREACH SELECT pr_name, mittel INTO name, summe FROM projekt pro1 WHERE rang > (SELECT COUNT(*) FROM projekt pro2 WHERE pro1.mittel < pro2.mittel) ORDER BY 2 DESC RETURN rang, name, summe WITH RESUME; END FOREACH; END FUNCTION; CREATE FUNCTION berechne_frachtgebuehr(von INTEGER, bis INTEGER) RETURNING MONEY(16,2) DEFINE maxNr INTEGER; DEFINE sumFracht MONEY(16,2); SELECT max(bestell_nr) INTO maxNr FROM Bestellung; IF von < 0 OR bis < 0 OR von > maxNr OR bis > maxNr THEN RETURN -1; END IF; SELECT SUM(frachtgebuehr) INTO sumFracht FROM Bestellung WHERE bestell_nr BETWEEN von AND bis; RETURN sumFracht; END FUNCTION; EXECUTE FUNCTION berechne_frachtgebuehr(1,50);
Trigger mit Procedure
CREATE PROCEDURE pr_gesamt_mittel (alter_wert DECIMAL(14,2), neuer_wert DECIMAL(14,2)); DEFINE alte_summe DECIMAL(14,2); DEFINE neue_summe DECIMAL(14,2); -- SET DEBUG FILE TO 'C:\tracedatei'; -- TRACE ON; -- Die Änderung der Tabelle wurde schon durchgeführt und in -- der Spalte mittel befinden sich schon die neuen Werte SELECT sum(mittel) INTO neue_summe FROM projekt; SELECT sum(mittel) + alter_wert - neuer_wert INTO alte_summe FROM projekt; IF neue_summe > alte_summe * 1.5 THEN RAISE EXCEPTION '-201'; END IF; END PROCEDURE; CREATE TRIGGER tr_gesamt_mittel UPDATE OF mittel ON projekt REFERENCING OLD AS vor NEW AS nach FOR EACH ROW (EXECUTE PROCEDURE pr_gesamt_mittel(vor.mittel, nach.mittel));
CREATE TRIGGER tr_mittel_aendern UPDATE OF mittel ON projekt REFERENCING OLD AS vor_wert NEW AS nach_wert FOR EACH ROW (INSERT INTO mittel_protokoll VALUES (vor_wert.pr_nr, USER, CURRENT, vor_wert.mittel, nach_wert.mittel)); -- Test des Triggers UPDATE projekt SET mittel = 1000 WHERE pr_name = 'Merkur';
-
Oh, ich habe mich ja noch gar nicht bedankt...
DANKE!
-
Gerne Hat es geholfen?
-
Bei dem Problem, was ich eben hatte leider nicht, aber da hat sich woanders was gefunden.
Abschreibvorlagen sind trotzdem immer wieder gut.