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. 🙂


Anmelden zum Antworten