Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Select zum Testen der Tabellen-Existenz

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von derhenry, 13 Mai 2015.

  1. derhenry

    derhenry Aktiver Benutzer

    Moin!
    Um zu überprüfen, ob eine Tabelle existiert und der Anwender die nötigen Rechte hat, setze ich per Makro dieses Statement ab:
    select top 1 * from...

    Da die Tabelle recht groß ist und ein Ergebnis erst nach über einer Minute zurückkommt, bekomme ich in anderen Anwendungen leider Timeouts.
    Habt Ihr eine Idee, wie ich obiges Ziel schneller erreichen kann?

    Danke und Grüße
    derhenry
     
  2. akretschmer

    akretschmer Datenbank-Guru

    In PostgreSQL würde ich in den Systemtabellen bzw. in information_schema.tables schauen, ob es die Tabelle gibt. Letzteres sollte eigentlich portabel sein und in mehr oder weniger allen Datenbanken funktionieren.
     
  3. derhenry

    derhenry Aktiver Benutzer

    Hey,
    danke für das Feedback. Wie mache ich das? Hat da ein Standardanwender (von dessem Rechner die Prüfung automatisch erfolgt) dort Zugriff drauf und lässt sich am Feedback unterscheiden, ob die Tabelle nicht da oder nur für den Anwender nicht verfügbar ist?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select count(*) from information_schema.tables where table_name = 'abc';
     count
    -------
      1
    (1 row)
    
    test=*# select count(*) from information_schema.tables where table_name = 'foo';
     count
    -------
      0
    (1 row)
    
    Du siehst den Unterschied?
     
  5. derhenry

    derhenry Aktiver Benutzer

    Cool, funktioniert auch bei MS-SQL. Ich bekomme bei einem gültigen Tabellennamen eine 1, bei einem ungültigen eine 0 zurück.
    Jetzt bin ich aber auch der Tabelleninhaber. Es lässt sich hiermit also nicht erkennen, ob die Tabelle nicht da oder nicht freigegeben ist.
    Aber danke!
     
  6. ukulele

    ukulele Datenbank-Guru

    Wiso dauert denn ein SELECT TOP 1 * FROM tabelle solange? Das liefert doch nur eine (beliebige) Zeile zurück, das darf eigentlich nicht lange dauern, egal wie groß die Tabelle ist.
     
  7. derhenry

    derhenry Aktiver Benutzer

    Tja, das ist eine gute Frage. War mir auch neu. Welchen Wert ich zurückbekomme wäre mir auch in der Tat egal.
    Vielleicht liegt es daran, dass ich auf einen View abfrage? Wenn ich das bei einem kleinen View (etwa 1000 Zeilen) mache, geht es recht fix. Bei 80000000 dauert es aber leider. :(
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Dann wird immer das zugrunde liegende Select ausgeführt. Du hast Deine Antwort.
     
  9. ukulele

    ukulele Datenbank-Guru

    Dann dürfte sich das Problem auch in anderen Abfragen bemerkbar machen, eventuell solltest du deine View überarbeiten oder ihren Einsatz überdenken.
     
  10. derhenry

    derhenry Aktiver Benutzer

    Der View ist schon nicht der schnellste, aber für seine Zwecke optimiert und unersätzlich. Es werden einige Tabellen miteinander verknüpft.
    Bei der regulären Abfrage ist eine Antwortzeit von einer Minute auch in Ordnung. Wie gesagt, möchte ich aber für einen anderen Prozess lediglich die Verbindung prüfen und gehe da mit obigen Query auf den View. Somit überprüfe ich ja auch die Verbindung (und die Rechte des Anwenders) für alle im View angesprochenen Tabellen.
    Etwas besseres fällt mir somit nicht ein. :(
    Trotzdem danke!
     
  11. ukulele

    ukulele Datenbank-Guru

    Du könntest statt auf die View zu gehen auf die Tabelle(n) gehen und dort einen Select machen, sollte den gleichen Nutzen haben und immernoch schneller sein.
     
  12. Tommi

    Tommi Datenbank-Guru

    Hallo,

    um die Existenz eines Objekts zu prüfen, kann man folgendes Statement benutzen:

    Code:
    SELECT OBJECT_ID('[Datenbank].[Schema].[Tabellenname]') as OID
    Generell funktioniert das auch mit
    Code:
    SELECT TOP 1 * FROM ...
    , aber das ist natürlich langsamer, da das Ergebnis alle Spalten für der Tabelle ausliest.
    Schneller sollte das gehen, wenn man nicht "SELECT *" benutzt sondern nur die PKEY-Spalte(n) der Tabelle ausliest (wegen Index!).

    Viele Grüße,
    Tommi
     
    Walter gefällt das.
  13. Tommi

    Tommi Datenbank-Guru

    Hi,

    noch ein Nachtrag. Mit
    Code:
    SELECT OBJECT_ID ('[Datenbank].[Schema].[Tabellenname]')
    lässt sich leider nicht die Berechtigung auf das Objekt prüfen!

    Viele Grüße,
    Tommi
     
  14. derhenry

    derhenry Aktiver Benutzer

    Danke für den Hinweis. Die Existenz der Tabelle setze ich eigentlich vorraus. Wichtiger ist zu prüfen, ob sie für den jeweiligen Anwender sicht- und lesbar ist.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden