MSSQL connection auf zwei Datenbanken
Paul1
- datenbank
- php
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
Könnt ihr löschen. Sorry
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
Besten Dank
Hallo
Besten Dank
Bitte. Ich möchte noch folgendes hinzufügen.
Tschö, Auge
Hi,
- 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
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
Hallo
- 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
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
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