Announcement

Collapse
No announcement yet.

Tabellen auf Spalten prüfen

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

  • Tabellen auf Spalten prüfen

    Hallo,
    ich müsste eine ganze Datenbank überprüfen, ob in jeder Tabelle 2 bestimmte Spalten vorkommen. Gibt es da eine Möglichkeite eine Abfrage zu erstellen, die mir als Ergebnis liefert welche Spalte in welcher Tabelle vorhanden ist?

    Bei der Einen Spalte funktioniert es mit:
    Code:
    SELECT
      TABLE_NAME,
      COLUMN_NAME
    FROM
      ALL_TAB_COLUMNS
    WHERE
      COLUMN_NAME LIKE '<Spalte>';
    Aber bei der 2ten Spalte geht das nicht so einfach, da muss ich prüfen, ob die Tabelle eine Spalte mit laufender Nummer enthält.

    Vielen Dank!
    Zuletzt editiert von Chriss; 15.11.2011, 15:10.

  • #2
    Ich würde,

    mit REGEXP arbeiten und die Spaltennamen in eine Number wandeln
    und die Tabellen auf die Einschränken, welche auch die Spalte 'Spalte' besitzen.

    Gruß

    MArtin

    Comment


    • #3
      Das mit der ersten Spalte habe ich mit einer simplen Abfrage lösen können, bei der zweiten ist es schwieriger.
      Das Problem ist, dass die Spalten unterschiedliche Bezeichnungen haben können. Ich muss nur herausfinden, ob es in der Tabelle eine Spalte mit fortlaufender Nummer gibt.

      geht das so?

      Comment


      • #4
        Was ist denn mit "eine Spalte mit fortlaufender Nummer" gemeint?
        Wird die Nummer mit einem Trigger und einer Sequenz gebildet?

        Wenn nicht bleibt dir wohl nur ein dynamisches Query.

        Gruss

        Comment


        • #5
          Hallo Wernfried,

          soweit ich das sehe, werden die Nummern über einen Trigger generiert:
          Code:
          BEFORE INSERT ON <Tabelle>
          FOR EACH ROW
          BEGIN
            /*Vergabe der laufenden Nummer */
            SELECT lfdnr_t.NEXTVAL
            INTO :new.lfdnr
            FROM dual;
          END
          lässt sich so eine Abfrage generieren, die solche Trigger auch berücksichtigt?

          und ich habe eine Sequenz gefunden, die wohl Laufende Nummern erzeugt:
          Code:
          CREATE SEQUENCE "Schema"."LFDNR_G" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE ;
          Zuletzt editiert von Chriss; 16.11.2011, 09:50.

          Comment


          • #6
            Originally posted by Chriss View Post
            Das mit der ersten Spalte habe ich mit einer simplen Abfrage lösen können, bei der zweiten ist es schwieriger.
            Das Problem ist, dass die Spalten unterschiedliche Bezeichnungen haben können. Ich muss nur herausfinden, ob es in der Tabelle eine Spalte mit fortlaufender Nummer gibt.

            geht das so?
            Wenn der Spaltenname aus definierten Nummerkreisen resultiert dann ja, wenn die DS einer bestimmten Spalte gemeint sind, dann nicht.

            Comment


            • #7
              Originally posted by Chriss View Post
              Hallo Wernfried,

              soweit ich das sehe, werden die Nummern über einen Trigger generiert:
              Code:
              BEFORE INSERT ON <Tabelle>
              FOR EACH ROW
              BEGIN
                /*Vergabe der laufenden Nummer */
                SELECT lfdnr_t.NEXTVAL
                INTO :new.lfdnr
                FROM dual;
              END
              lässt sich so eine Abfrage generieren, die solche Trigger auch berücksichtigt?

              und ich habe eine Sequenz gefunden, die wohl Laufende Nummern erzeugt:
              Code:
              CREATE SEQUENCE "Schema"."LFDNR_G" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE ;

              Sind aber unterschiedliche sequences.
              In der all_sequences könntest du nach dem Namen suchen und dir auch die letzte Nummer anzeigen lassen.
              In der all_source könntest du sehen, wo die sequence angewendet wird.

              Verstehe nur noch nicht ganz, warum du einen Tabelle suchst, welche du durch den Trigger schon identifiziert hast.

              Comment


              • #8
                Schau dir mal den View USER_TRIGGER_COLS an.
                Dort findest du die Spalten welche durch einen Trigger verändert werden.

                Ob ein Trigger eine Sequenz verwendet kannst du im View USER_DEPENDENCIES herausfinden:
                [highlight=sql]SELECT *
                FROM USER_DEPENDENCIES
                WHERE TYPE = 'TRIGGER' and REFERENCED_TYPE = 'SEQUENCE'[/highlight]

                Es werden dir natürlich nur Abhänigkeiten angezeigt. Ob die fragliche Spalte tatsächlich nur aus fortlaufenden Nummern besteht kann man nicht sagen, sondern nur vermuten.

                Wenn du sicher gehen musst, dann bleibt dir nichts anderes übrig als alle Zeilen dieser Spalte dynamisch zu selektieren und das Ergebnis zu überprüfen

                Einen weiteren Hinweis(!!) bekommst du vielleicht wenn du dir die Spalte NUM_ROWS aus dem View USER_TABLES nimmst und mit NUM_DISTINCT aus dem View USER_TAB_COLUMNS vergleichst. Ausserdem kannst du noch LOW_VALUE und HIGH_VALUE aus USER_TAB_COL_STATISTICS verwenden (musst du aber zuerst noch konvertieren)

                Gruss

                Comment


                • #9
                  Mit einer solchen Query kannst du abfragen ob alle Zahlen in der Spalte_2 fortlaufend sind:
                  [highlight=sql]
                  WITH seq AS
                  (SELECT LEVEL AS SEQ_NUM
                  FROM dual
                  CROSS JOIN (SELECT MIN(Spalte_2) AS MIN_ID, MAX(Spalte_2) AS MAX_ID FROM <TABLE>)
                  WHERE LEVEL >= Min_ID
                  CONNECT BY LEVEL <= MAX_ID)
                  SELECT *
                  FROM seq
                  FULL OUTER JOIN <TABLE> ON Spalte_2 = SEQ_NUM
                  WHERE Spalte_2 IS NULL
                  [/highlight]

                  Wenn es nur fortlaufende Zahlen gibt liefert dir die Query keine Zeile.

                  Um ganz sicher zu gehen musst du noch testen ob evtl. Zahlen doppelt vorkommen, entweder über COUNT(DISTINCT ...) oder du schaust nach ob es einen Unique Constraint auf der Spalte gibt.

                  Gruss

                  Comment


                  • #10
                    Vielen Dank!
                    Ich habe es mal getestet, aber da die Werte wohl über eine Sequenz generiert und mehrere Tabellen damit bestückt werden kann ich das so wohl nicht herausfinden.
                    Heute werde ich mir dazu die Tipps aus deinem vorletzten Thread noch genauer ansehen.

                    Comment

                    Working...
                    X