Announcement

Collapse
No announcement yet.

Tabellen erstellen (Trigger) Syntaxfrage

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

  • Tabellen erstellen (Trigger) Syntaxfrage

    Guten Tag zusammen,

    Im Zuge meiner Diplomarbeit habe bezüglich zu der Erstellung von Tabellen unter Einbehaltung der entsprechenden Beziehungen ein paar offene Fragen.
    Ich hoffe hier kann mir vielleicht jemand weiterhelfen.

    Es handelt sich hierbei lediglich um einen kleinen Zusatz, den ich gerne in meiner Diplomarbeit integrieren möchte. Da wir hier im Unternehmen jedoch lediglich mit Access arbeiten habe ich keine Möglichkeit den "Code" zu testen und so entprechend Fehler zu beheben...

    Zum einen möchte ich garantieren, dass ein Primärschlüsselwert einer Tabelle mindestens einmal als Fremdschlüsselwert in einer weiteren Tabelle vorhanden ist.
    Wäre dies folgendermaßen korrekt:

    Code:
    	CREATE TABLE Tabellenname
    	ID Primärschlüssel UNIQUE NOT NULL
    	…
    	PRIMARY KEY (Primärschlüssel)
    	CHECK (Primärschlüssel IN (SELECT ID_Fremdschlüssel FROM Fremdschlüsseltabelle)
    Weiter würde ich gerne eine 1 : 60..90 Beziehung zwischen zwei Klassen sicherstellen. Ist dies auch mit einer Check-Bedingung möglich oder muss hierfür zusätzlich ein Trigger erzeugt werden?
    Habe folgendes gedacht, nur keine Ahnung ob es so auch richtig ist:

    Code:
    	CREATE TRIGGER Trigername 
    	FOR Tabellename BEFORE INSERT 
    	AS 
    		BEGIN 
    			IF (	SELECT Count(*) 
    				FROM Tabellename 
    				WHERE ID = new.ID) not between 60 and 90 
    				RAISE_APPLICATION_ERROR( 
    				-20901, 
    				'Integritätsregel verletzt!' 
    			   ); 
    		END
    Meine letzte Frage bezieht sich auf eine Generalisierung. Ich möchte sicherstellen, dass wenn ich einen Datensatz aus der spezialisierten Tabelle lösche, dass automatisch auch die Daten aus der Tabelle gelöscht werden, auf welche dieser verweit.Auch hier denke ich, dass dies wieder nur durch einen Trigger sicherzustellen ist, oder?

    Code:
     
    	CREATE TRIGGER Trigername 
    	FOR Tabellename BEFORE DELETE 
    	AS 
    		BEGIN 
    			DELET FROM Tabellename
    			WHERE Fremdschlüssel.Verweistabelle = Primärschlüssel.spezialisierteTabelle 			
    		END
    ???? Auch hier bin ich mir sehr unsicher und denke eher das es falsch ist.
    Vielleicht kannmir ja hier jemand ohne große Mühen weiterhelfen.. Ich würde mich auf jeden Fall sehr freuen!

    Gruß, vielen Dank und noch einen schönen Abend,
    Bernhard

  • #2
    Code:
    	CREATE TABLE Tabellenname
    	ID Primärschlüssel UNIQUE NOT NULL
    	…
    	PRIMARY KEY (Primärschlüssel)
    	CHECK (Primärschlüssel IN (SELECT ID_Fremdschlüssel FROM Fremdschlüsseltabelle)
    geht nicht, da der Primärschlüssel ja vorhanden sein muß, wenn man ihn in einer anderen Tabelle als Fremdschlüssel verwendet.

    d.h. beim Anlegen des Primärschlüssels in Tabelle Tabellenname kann er noch gar nicht in Tabelle Fremdschlüsseltabelle als Fremschlüssel vorhanden sein


    Code:
    	CREATE TRIGGER Trigername 
    	FOR Tabellename BEFORE INSERT 
    	AS 
    		BEGIN 
    			IF (	SELECT Count(*) 
    				FROM Tabellename 
    				WHERE ID = new.ID) not between 60 and 90 
    				RAISE_APPLICATION_ERROR( 
    				-20901, 
    				'Integritätsregel verletzt!' 
    			   ); 
    		END
    eher als Check Bedingung

    Code:
     
    	CREATE TRIGGER Trigername 
    	FOR Tabellename BEFORE DELETE 
    	AS 
    		BEGIN 
    			DELET FROM Tabellename
    			WHERE Fremdschlüssel.Verweistabelle = Primärschlüssel.spezialisierteTabelle 			
    		END
    Kein Trigger, sondern Fremdschlüssel mit ON CASCADE DELETE erstellen

    (Sorgt dafür das, wenn der Primärschölüssel gelöscht wird,alle abhängigen Daten gelöscht werden)

    Ebis
    Zuletzt editiert von ebis; 15.04.2008, 13:01. Reason: zuviel gequoted

    Comment


    • #3
      Code:
      	CREATE TABLE Tabellenname
      	ID Primärschlüssel UNIQUE NOT NULL
      	…
      	PRIMARY KEY (Primärschlüssel)
      	CHECK (Primärschlüssel IN (SELECT ID_Fremdschlüssel FROM Fremdschlüsseltabelle)
      geht nicht, da der Primärschlüssel ja vorhanden sein muß, wenn man ihn in einer anderen Tabelle als Fremdschlüssel verwendet.

      d.h. beim Anlegen des Primärschlüssels in Tabelle Tabellenname kann er noch gar nicht in Tabelle Fremdschlüsseltabelle als Fremschlüssel vorhanden sein


      ==> Würde es denn so funktionieren, wenn ich innerhalb einer Transaktion den Fremdschlüsseldatensatz und Primärschlüsseldatensatz gleichzeitig erzeugen würde?

      Und gibt es sonst eine Möglichkeit sicherzustellen, dass der Primärschlüssel auf jeden Fall als Fremdschlüssel vorkommen muss? (Wie etwa in der 1:N Beziehung?)

      Code:
      	CREATE TRIGGER Trigername 
      	FOR Tabellename BEFORE INSERT 
      	AS 
      		BEGIN 
      			IF (	SELECT Count(*) 
      				FROM Tabellename 
      				WHERE ID = new.ID) not between 60 and 90 
      				RAISE_APPLICATION_ERROR( 
      				-20901, 
      				'Integritätsregel verletzt!' 
      			   ); 
      		END
      eher als Check Bedingung

      ==> Wäre also folgender Code formal korrekt?

      Code:
      check (SELECT Count(*) FROM Tabellename
                  WHERE ID = new.ID)  between 60 and 90 )
      Bin mir da nicht ganz sicher mit new.ID! Sprech ich den neuen Primärschlüssel so an?

      Code:
       
      	CREATE TRIGGER Trigername 
      	FOR Tabellename BEFORE DELETE 
      	AS 
      		BEGIN 
      			DELET FROM Tabellename
      			WHERE Fremdschlüssel.Verweistabelle = Primärschlüssel.spezialisierteTabelle 			
      		END
      Kein Trigger, sondern Fremdschlüssel mit ON CASCADE DELETE erstellen

      (Sorgt dafür das, wenn der Primärschölüssel gelöscht wird,alle abhängigen Daten gelöscht werden)


      Ich möchte nun aber zusätzlich noch sicherstellen, dass auch immer der Primärschlüsseldatensatz gelöscht wird, falls der Fremdschlüsseldatensatz gelöscht wurde.

      Ein Beispiel wäre etwa eine Tabelle mit Mitarbeitern mit den Eigenschaften: Name, Vorname und ID
      Dazu eine Tabelle Kunden mit einem Verweis auf die Tabelle Mitarbeiter, da jeder Kunde auch einen Namen, Vornamen und eine ID besitzt, und zusätzlich der Spalte E-Mailadresse. Lösche ich jetzt nur den Fremdschlüssel der Tabelle Kunde, so wird in der Tabelle Mitarbeiter aus einem Kunden ein Mitarbeiter, da er ja keinen Verweis mehr hat, das jedoch möchte ich auf jeden Fall verhindern!

      Gruß und an dieser Stelle nochals VIELEN DANK!!!!!!!!!!!!!!!
      Bernhard!

      Comment


      • #4
        Originally posted by Dude1983 View Post
        [
        Ein Beispiel wäre etwa eine Tabelle mit Mitarbeitern mit den Eigenschaften: Name, Vorname und ID
        Dazu eine Tabelle Kunden mit einem Verweis auf die Tabelle Mitarbeiter, da jeder Kunde auch einen Namen, Vornamen und eine ID besitzt, und zusätzlich der Spalte E-Mailadresse. Lösche ich jetzt nur den Fremdschlüssel der Tabelle Kunde, so wird in der Tabelle Mitarbeiter aus einem Kunden ein Mitarbeiter, da er ja keinen Verweis mehr hat, das jedoch möchte ich auf jeden Fall verhindern!

        Gruß und an dieser Stelle nochals VIELEN DANK!!!!!!!!!!!!!!!
        Bernhard!
        Datenbank Design grundsätzlich überdenken?

        (Wozu haben Kunden einen Verweis auf Tabelle Mitarbeiter?,
        schließlich sind es Kunden und keine Mitarbeiter)

        z.B.

        Tabelle Person mit ID, Name...

        Tabelle Kunde mit ID, Person_ID, Kundenkram

        Tabelle Mitarbeiter mit ID, Person_ID, Mitarbeiterkram

        Comment

        Working...
        X