Announcement

Collapse
No announcement yet.

selber Trigger für mehrere/alle Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • selber Trigger für mehrere/alle Tabellen

    Hallo!

    ich bin neu registriert hier, obwohl ich mir schon länger viel gute tips aus dem forum heraussuche

    was trigger angeht bin ich noch recht unbedarft und hab dazu eine vermutlich grundlegende frage, und zwar hab ich in meinen tabellen (in fast allen) ein feld namens "createuser" indem der user, der das insert ausführt eingetragen wird. sieht so aus:

    [highlight=sql]
    create trigger ins_tbl_xyz
    before INSERT on tbl_xyz
    for each row set new.createuser=session_user();
    [/highlight]

    ich kann jetzt diesen trigger für jede tabelle anlegen und jeweils das "tbl_xyz" in den entsprechenden tabellennamen ändern, mit dem ergebnis ich habe 25 trigger, die sich nur durch den tabellennamen unterscheiden. sinnvoller wäre es für mich einen datenbankweiten trigger anzulegen, der mir den "new.createuser" und auf die tabelle anwendet auf die das INSERT durchgeführt wird. also z.b. so

    [highlight=sql]
    create trigger ins_createuser
    before INSERT on "ANY_TABLE"
    for each row set new.createuser=session_user();
    [/highlight]

    bzw.
    [highlight=sql]
    create trigger ins_createuser
    before INSERT on tbl_xyz, tbl_abc, tbl_efg,....
    for each row set new.createuser=session_user();
    [/highlight]
    ist sowas möglich? was müsste anstelle des "ANY_TABLE" stehen, bzw. kann ich mehrere tabellen nach dem "INSERT on" eintragen?

    oder gibt es sowieso eine besser möglichkeit das von mir gewünschte ergebnis zu erzielen?

    ich danke euch für die unterstützung!! lg

    phil
    Zuletzt editiert von idsC; 12.11.2010, 11:50.

  • #2
    Hallo,

    Hinweis: Formatierung von SQL in Beiträgen

    Zum Thema: Diese Art von Trigger gibt es in MySQL nicht. Du wirst nicht umhin kommen, für jede Tabelle einen Trigger zu erstellen.
    Man könnte maximal eine SP schreiben, die dann von jedem Trigger aufgerufen werden kann.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      danke für die antwort, hab meinen post editiert um den vorgaben zu entsprechen, sorry!
      is es sinnvoll eine solche serverprozedur zu schreiben, oder holt man sich damit mehr probleme als vorzüge? danke und fg

      philipp

      Comment


      • #4
        Hallo,
        wie sinnvoll eine SP ist hängt sicherlich von der Grösse des Codes ab, der wiederverwendet werden kann. Ich bin mir jedoch momentan gar nicht sicher, ob innerhalb einer SP auf new und old zugegriffen werden kann.

        Gruss Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Originally posted by idsC
          ich kann jetzt diesen trigger für jede tabelle anlegen und jeweils das "tbl_xyz" in den entsprechenden tabellennamen ändern, mit dem ergebnis ich habe 25 trigger, die sich nur durch den tabellennamen unterscheiden. sinnvoller wäre es für mich einen datenbankweiten trigger anzulegen, der mir den "new.createuser" und auf die tabelle anwendet auf die das INSERT durchgeführt wird.
          Ein Trigger ist immer einzigartig UND mit einer physikalisch (permanente) Tabelle verbunden; d.h. also in Deinem Fall: für jeder Tabelle MUSSt Du einen entsprechenden Trigger schreiben.

          Nun, das ist zwar etwas Tipparbeit, aber ist ja nur EINMALIG zu machen

          Anstelle der vielen (fast) gleichartigen Trigger kannst Du auch eine SP verwenden - unter der Voraussetzung, dass ALLE Tabellen den GLEICHEN Aufbau haben:

          Code:
          BEGIN
          /* Name der Tabell, in die ein datensatz eingefügt werden soll */
          SET @tabelle=paramtabelle;
          
          /* IN-Parameter (feld1, feld2, ... feldn) für Tabellenfelder in serverseitige Variablen speichern */
          SET @var1=param1;
          SET @var2=param2;
          /* ggf weitere Parameter bzw Variablen... */
          
          /* aktueller User der Session */
          SET @createuser=SESSION_USER();
          
          /* INSERT-Statement vorbereiten */
          SET @stmt=
          	CONCAT('INSERT INTO ', 
          			@tabelle,
          			 ' (feld1, feld2, createuser) VALUES (?, ?, ?)');
          			 
          /* Statement serverseitig erstellen/vorbereiten */			 
          PREPARE erg FROM @stmt;
          
          /* vorbereitetes Statement ausführen mit den enstprechenden Parametern */
          EXECUTE erg USING @var1, @var2, @createuser;
          
          END
          
          /* paramtabelle, param1, param2,... sind die an die SP zu übergebenden Parameter */
          Du übergibst an die SP alle Werte, die für den neuen Datensatz notwendig sind UND den Namen der Tabelle, die den neuen Datensatz erhalten soll. Der Wert für createuser wird innerhalb der SP 'ermittelt' und braucht daher nicht als IN-Parameter übergeben werden.

          @Falk: Soweit ich das verstehe, sind NEW.col_name bzw OLD.col_name nur für Trigger zulässig; hier machen sie auch m.E. Sinn...

          Gruß
          Rainer

          Comment


          • #6
            Wenn Session_User() eine SQL-Funktion ist, lässt diese sich doch in ein Default stopfen...
            Vielleicht geht das ja auch unter Mysql...
            [HIGHLIGHT="SQL"]CREATE TABLE Test
            (createuser VARCHAR(100)
            , CONSTRAINT DF_Test_CreateUser DEFAULT (Session_User()) FOR createuser
            )[/HIGHLIGHT]

            Comment

            Working...
            X