Paul1: MSSQL connection auf zwei Datenbanken

Hallo, wie kann ich in PHP eine Abfrage über zwei Datenbanken machen?

Als Beispiel:

SELECT datenbank1.tbl_a.name
FROM datenbank1.tbl_a
INNER JOIN datenbank2.tbl_b 
ON datenbank1.tbl_a.id = datenbank2.tbl_b.id

Also ganz speziell gefragt: Kann man eine Connection zu einem MSSQL Datenbankserver aufbauen, ohne die Datenbank angeben zu müssen? Und dann die SQL Abfrage auf zwei Datenbanken beziehen?

Danke und Gruß, Paul

PS: ich habe hier was gefunden, ist aber altes PHP

  1. Könnt ihr löschen. Sorry

  2. Hallo

    wie kann ich in PHP eine Abfrage über zwei Datenbanken machen?

    Als Beispiel:

    SELECT datenbank1.tbl_a.name
    FROM datenbank1.tbl_a
    INNER JOIN datenbank2.tbl_b 
    ON datenbank1.tbl_a.id = datenbank2.tbl_b.id
    

    Also ganz speziell gefragt: Kann man eine Connection zu einem MSSQL Datenbankserver aufbauen, ohne die Datenbank angeben zu müssen? Und dann die SQL Abfrage auf zwei Datenbanken beziehen?

    Ja, das kann man. Die MS-Doku sagt dazu (Fußnote 2 unter der Tabelle des verlinkten Abschnitts):

    „All queries executed on the established connection are made to the database that is specified by the Database attribute. However, if the user has the appropriate permissions, data in other databases can be accessed by using a fully qualified name. For example, if the master database is set with the Database connection attribute, it is still possible to execute a Transact-SQL query that accesses the AdventureWorks.HumanResources.Employee table by using the fully qualified name.“

    Das „Database attribute“ ist der Datenbankname, der im Array für die Verbindungsdaten steht, der in sqlsrv_connect benutzt wird. Du brauchst also für den Datenbankbenutzer die Berechtigungen auf die andere DB zuzugreifen („appropriate permissions“) und in den Queries den vollen Namen einer Tabelle inklusive des Datebanknamens („fully qualified name“), zum Beispiel Datenbankname.dbo.Tabellenname.

    Tschö, Auge

    --
    200 ist das neue 35.
    1. Besten Dank

      1. Hallo

        Besten Dank

        Bitte. Ich möchte noch folgendes hinzufügen.

        1. Du kannst auf diese Weise natürlich nur Datenbanken erreichen, die auf dem Server, zu dem du die Verbindung hergestellt hast, verfügbar sind. Eine Abfrage, die sich nicht nur auf Tabellen in verschiedenen Datenbanken auf einem Server sondern auf Tabellen in Datenbanken auf verschiedenen Servern bezieht, ist so nicht möglich.
        2. Ich halte es für dringendst empfehlenswert, Abfragen auf Tabellen nicht direkt aus dem PHP-Code heraus auszuführen, sondern dafür den Umweg über Stored Procedures (SP) auf dem MS-SQL-Server zu gehen. Damit bleiben im PHP-Code nur die Aufbereitung der an die Prozeduren zu übergebenden Parameter und die Aufrufe selbst übrig und alles andere findet auf dem SQL-Server statt. Zudem kannst du in SP recht komplexe Programme schreiben, die unabhängig vom PHP-Code gepflegt werden können.

        Tschö, Auge

        --
        200 ist das neue 35.
        1. Hi,

          1. Ich halte es für dringendst empfehlenswert, Abfragen auf Tabellen nicht direkt aus dem PHP-Code heraus auszuführen, sondern dafür den Umweg über Stored Procedures (SP) auf dem MS-SQL-Server zu gehen.

          Ernsthaft?

          Also statt sowas wie
          select id, displayname, isadmin from user where username = 'xxx' and password = 'yyy';
          würdest Du eine Stored Procedure schreiben, die letztendlich genau dasselbe macht?

          (ich vermute mal, daß viele Provider stored procedures gar nicht erlauben, aber abgesehen davon sehe ich den Sinn der Stored Procedure nicht wirklich)

          cu,
          Andreas a/k/a MudGuard

          1. Hallo MudGuard,

            mit dem Erlaubnisproblem hast Du recht.

            Was mich bei SP auch nervt, ist, dass man nicht im Programmcode sieht, welche Query ausgeführt wird.

            Aber die architektonische Grundsatzaussage ist richtig: SQL dahin, wo es auch ausgeführt wird. Und die SP liefert nur die gewünschten Daten. Das ist eine durchaus wünschenswerte Modularisierung. Und falls Du was an der DB umbauen musst, hast Du gute Chancen, diesen Umbau durch Prozeduranpassungen vor den Programmen zu verstecken. Das kann eine gute Sache sein. Muss nicht...

            In einem Projekt, an dem ich vor Jahren teilnahm, hat der DB Kollege es allerdings übertrieben. Da war nachher ein beträchtlicher Teil der Fachlogik in einem einzigen SQL UPDATE Statement vergraben.

            Rolf

            --
            sumpsi - posui - obstruxi
          2. Hallo

            1. Ich halte es für dringendst empfehlenswert, Abfragen auf Tabellen nicht direkt aus dem PHP-Code heraus auszuführen, sondern dafür den Umweg über Stored Procedures (SP) auf dem MS-SQL-Server zu gehen.

            Ernsthaft?

            Ja, ernsthaft.

            Also statt sowas wie
            select id, displayname, isadmin from user where username = 'xxx' and password = 'yyy';
            würdest Du eine Stored Procedure schreiben, die letztendlich genau dasselbe macht?

            Da hast du dir ein nettes, simples Beispiel herausgesucht. Dir ist ganz bestimmt klar, dass damit auch beliebig komplexere Aufgaben erledigt werden können, oder? Ich speichere und verarbeite zum Beispiel in einer Anwendung ein JSON-Objekt mit geschachtelter Struktur. Die Übergabe erfolgt aus einem Python-Skript [1] an eine SP, die das Objekt auseinanderpflückt und die Inhalte auf die veschiedenen zuständigen Tabellen verteilt. Das will ich nicht in Python oder eben auch in PHP tun müssen. Und ja, weil ich dieses System so benutze, erfolgen, quasi als Nebenprodukt, auch die SELECTs per Prozedur.

            (ich vermute mal, daß viele Provider stored procedures gar nicht erlauben, aber abgesehen davon sehe ich den Sinn der Stored Procedure nicht wirklich)

            Ich kenne keinen Hostinganbieter, der in seinen Standard-Webspace-Paketen [2] einen MS-SQL-Server-Zugang anbietet. Aber auf einem eigenen Server mit eigener Datenbankinstanz kann man das haben (manchmal muss man auch).

            Ich gehe auch davon aus, dass sich niemand für ein kleines Webprojekt freiwillig einen MS-SQL-Server ans Bein bindet, wo doch MySQL- oder PostgreSQL in den üblichen Hostingpaketen dabei sind. Wenn Paul1 hier nach so etwas fragt, gehe ich von einer Arbeitsaufgabe aus, wo ein MS-SQL-Server schon vorhanden ist und eine Weboberfläche dazukommen soll. Ich kann natürlich mit meiner Vermutung falsch liegen, will den Tip aber dennoch geben. Mir hat dieses Verfahren jedenfalls jede Menge Kopfschmerzen erspart.

            Tschö, Auge

            --
            200 ist das neue 35.

            1. das mache ich in einer anderen Anwendung auch in PHP auf diese Art und Weise ↩︎

            2. also nicht Serverangebote ↩︎

  3. Hallo Paul1,

    beim Connect zu einem MS SQL Server gibst Du die Default-DB an. Über entsprechende Qualifizierer kannst Du auch andere DBs ansprechen. Setzt voraus, dass die Berechtigungen auf dem Server passen.

    Bei MySQL habe ich noch keine Versuche dazu gemacht.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Bei MySQL habe ich noch keine Versuche dazu gemacht.

      Vor Jahren habe ich Daten an einen Ersatzserver geschickt (backup), der bei Ausfall des Hauptservers genutzt werden konnte.

      Da habe ich jede der beiden Datenbanken geöffnet und den Ersatzserver gefragt: Welchen Zeitstempel hat dein letzter Eintrag?

      Ab da wurden die Daten kopiert.

      EDIT: Ich hatte MySQL und nicht MSSQL