Zugriff auf MS-SQL-DB möglich?
Eingetragen von ralf32 (9)
am 13.06.2008 - 12:02 Uhr in
am 13.06.2008 - 12:02 Uhr in
Hallo,
wir verkaufen Schulungen und planen gerade den Relaunch einer Website, die für den "Shop" zwingend einen Datenaustausch mit einer MS-SQL-DB benötigt.
Die Inhalte der Website sollen in der Drupal-DB liegen, jedoch soll es möglich sein, aus der MS-SQL-DB Daten zu lesen und auch dorthin zu schreiben. Dabei handelt es sich um Kursdaten (Kurs=Schulung), die wegen der Datenverwaltung in-house zwingend in der MS-SQL-DB bleiben müssen.
Ist so etwas mit Drupal machbar und sinnvoll?
Gruß und Danke
Ralf
- Anmelden oder Registrieren um Kommentare zu schreiben
Eher Frage an PHP
am 13.06.2008 - 12:08 Uhr
Ich denke, die Frage geht eher an PHP. Wenn du eine Windows Kiste hast und ODBC nutzen kannst, kannst du bestimmt Daten austauschen. Drupal ist prinzipiell Datenbank undabhängig durch eine Zwischenschicht. Aber es gibt afaik keine Umsetzung aus MS SQL oder Access.
Von daher müsstet ihr mindestens eine Schnittstelle selbst schreiben und dann wird der Datenzugriff eher das grundsätzliche Problem für PHP darstellen als eines für Drupal. Wobei sich die Gemeinde bestimmt freuen würde, wenn ihr ein MS DB Modul baut ;)
---
Viele Grüße,
Kars-T
Arbeit: comm-press
Hobbies: Tower Defense HQ, plamo.de, Blog
Viele Grüße,
Kars-T
... und sinnvoll?
am 13.06.2008 - 12:36 Uhr
Danke Kars-T,
das ging ja fixer als erwartet! Der Gedanke, dass es eher eine Frage von PHP ist, kam mir auch schon. Aber dennoch: Ist solch ein Konstrukt (Drupal auf Linux-Server mit MySQL und zweite DB mit MS-SQL für Lese- und Schreibzugriff via PHP) denn überhaupt empfehlenswert? Oder ist die PHP-MS-SQL-Erweiterung nicht stabil genug bzw. aus anderen Gründen ungeeignet?
Gruß
Ralf
XML?
am 13.06.2008 - 13:05 Uhr
Ich habe keine Erfahrungen mit PHP und MS aber wenn du das so oder so mit zwei Datenbanken machen willst, hast du eine Menge anderer Möglichkeiten Daten zwischen den System hin und her zu schieben. Der MS SQL kann ja auf verschiedenste Weise XML, CSV, JSON oder sonst was erzeugen und die Server kommunizieren dann einfach. Wenn der Master Stand zB. der MS SQL ist, dann fragt der Webserver per Cron Daten ab und importiert das.
Gibt es tausende von Möglichkeiten.
---
Viele Grüße,
Kars-T
Arbeit: comm-press
Hobbies: Tower Defense HQ, plamo.de, Blog
Viele Grüße,
Kars-T
wie im Pro Drupal
am 13.06.2008 - 13:23 Uhr
wie im Pro Drupal Development steht, gibt es eine Database Abstraction API, mit welcher man eigene SQL Datenbanken anbieten kann.
Dazu http://api.drupal.org/api/group/database/5 gibt es mehr Informationen
Aber ob sich der Aufwand wirklich lohnt
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Wichtig ist Echtzeit und Lesen und SCHREIBEN
am 13.06.2008 - 13:27 Uhr
Da auch Schulungen offline verkauft werden, soll im Internet die Zahl der freien Plätze in Echtzeit angezeigt werden und bei Online-Buchung sollen die Leute am guten alten Verkaufstresen auch gleich sehen, dass ein weiterer Platz belegt ist. Mit einem cron-job wäre das doch nicht sinnvoll, oder?
Und der Datenverkehr muss ja auch in beide Richtungen (Preis und andere Attribute der Schulungen müssen ins Web und Buchungsdaten müssen vom Web in die MS-SQL-DB).
Welche der vielen Möglichkeiten wäre denn für solch einen Fall am sinnvollsten, sichersten, stabilsten, kostengünstigsten?
Gruß
Ralf
Nun ja, wenn man den
am 23.06.2008 - 17:15 Uhr
Nun ja, wenn man den Cron-Job alle paar Minuten laufen ließe.. Es hängt dann vom Einzelfall ab, ob einem dies "Echtzeit" genug ist.
Ansonsten müsste man sich mit eigenen Modulen behelfen, welche direkt die MS SQL DB abfragen und daraus Blöcke / Ansichten zur Verfügung stellen. Ebenfalls könnte man Formulare bereitstellen, die eben solches tun. Die ganzen Vorzüge eines Drupal-Systems gehen einem natürlich flöten, wenn man die Daten nicht wirklich als Nodes im System zur Verfügung hat.
--
"Look, Ma, I'm dead!"
Cell, Stephen King
Suchmaschinenoptimierung (SEO) & Drupal
Der Thread ist zwar schon
am 25.11.2009 - 13:07 Uhr
Der Thread ist zwar schon etwas älter, aber ich habe ähnliches vor.
Drupal ruht auf einer MySQL-DB, die Mitarbeiterdaten auf einem MS SQL Server.
Mittels PHP will ich eine Abfrage erstellen, die mir die einzelnen Fehlzeiten ausgibt.
Der Sicherheit wegen wollte ich hierfür eine extra Tabelle in der MySQL-DB anlegen, in der lediglich die benötigten Daten gespeichert sind (MA-Nummer, Fehltag(e), Grund) und die per CronJob aktualisieren.
Damit brauche ich nicht bei jedem neuem Aufruf der Fehlzeiten (durch die User) eine Verbindung zur MS SQL DB herstellen und die Daten abfragen, sondern nur die Kopien auf der MySQL-DB.
Hat jemand eine zündende Idee, wie man sowas am ehesten realisieren kann?
Eine "Quick and Dirty" Lösung möchte ich dabei tunlichst vermeiden!
Vornehmlich geht es mir darum, wie ich es schaffe die Daten aus der MS SQL DB ins MySQL zu schaufeln und für den Cron scharf zu stellen, die restliche Abfrage und Ausgabe über MySQL sollte an sich ja nicht so schwierig werden oder? Kann man für diesen Schritt auch Views benutzen? Bin in der Sache noch nicht ganz so firm...
My software has no bugs - It just develops random features...
Sowas in der Art durfte ich
am 25.11.2009 - 15:58 Uhr
Sowas in der Art durfte ich auch schonmal machen. Ist eigentlich garnicht so schwer. Ich hatte damals eine PHP-Klasse erstellt, die die Verbindung zur MSSQL-Datenbank aufbaut. Um die Daten dann auszulesen hab ich dann ein Modul geschrieben, in dem ein Objekt der PHP-Klasse erstellt wird. So konnte ich die Daten der MSSQL-DB auslesen und in die Drupal-DB ablegen.
Du könntest das ganz ähnlich realisieren. Über die Hook hook_cron kannst du wie oben beschrieben bei jedem Cron-Lauf die Daten auslesen und in der Drupal-DB ablegen. Es ist sicher auch möglich aus den Daten Nodes erstellen zu lassen, die dann mit Views angezeigt werden können.
Jetzt bleiben nurnoch folgende Frage offen: Wie gut sind deine PHP- und SQL-Kenntnisse? :-)
Mit PHP hatte ich bis jetzt
am 25.11.2009 - 16:27 Uhr
Mit PHP hatte ich bis jetzt ziemlich wenig Kontakt.
Mit MySQL dagegen schon mehr.
Die Abfragen zu formulieren ist jetzt auch nicht die Herausforderung für mich, lediglich das Ganze mit PHP zum Laufen zu kriegen...
Sofern das Copyright keine Probleme darstellt, würde ich mir sonst ganz gern dein Modul etc ansehen.
My software has no bugs - It just develops random features...
Die PHP-Klasse für die
am 26.11.2009 - 08:41 Uhr
Die PHP-Klasse für die Datenbank-Verbindung sah etwa so aus
<?php
/**
* @file: File-Name mssql.class.php
*/
class mssql
{
// VARIABLEN *****************************************************************
protected $dbname;
protected $dbhost;
protected $dbuser;
protected $dbpass;
private $con;
private $sql;
private $ressourceId;
// CONNECT UND DB SELECT (EXCEPTION) *****************************************
public function __construct($dbname = 'DATENBANKNAME',
$dbhost = 'DATENBANKADRESSE',
$dbuser = 'USERNAME',
$dbpass = 'PASSWORT')
{
$this->dbname = $dbname;
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
// CONNECTION
$this->con = mssql_connect($this->dbhost,$this->dbuser,$this->dbpass) OR die('connect fehler');
// DATENBANK
mssql_select_db($this->dbname, $this->con) OR die('select db fehler');
}
// QUERY *********************************************************************
public function query($sSql)
{
$this->sql = $sSql;
$this->ressourceId = @mssql_query($sSql) OR die('query fehler: '.$this->sql);
}
// FETCH OBJECT **************************************************************
public function fetchObject($all = TRUE)
{
// ANZAHL DER EINTRÄGE
$anz = mssql_num_rows($this->ressourceId);
// WENN ANZAHL GRÖSSER 1 ODER ALL GLEICH TRUE RETURN ARRAY
if(($anz > 1) OR ($all == TRUE))
{
$r = array();
for($i=0;$i<$anz;$i++)
{
$r[$i] = mssql_fetch_object($this->ressourceId);
}
// ELSE RETURN OBJECT
}else
{
$r = mssql_fetch_object($this->ressourceId);
}
return $r;
}
}
?>
In der __construct - Funktion musst du dann natürlich die Daten deiner MSSQL-Datenbank eingeben. Ein bissel was dazu kannst du hier lesen.
Dann musst du nurnoch ein eigenes Modul schreiben. Wie man sowas grundsätzlich macht kannst du hier nachlesen. In deinem Modul kannst du dann mit hook_cron die Verbindung beim Cron-Lauf aufbauen, die Daten auslesen und in die Drupal-DB speichern.
<?php
require_once 'PFAD/ZUR/MSSQL-KLASSE/mssql.class.php';
function DEIN_MODUL_cron()
{
$sql = "DEINE SQL-Anweisung";
$datenbank = new mssql(); //Objekt der MSSQL-Klasse - Verbindungsaufbau
$datenbank->query($sql);
$daten = $datenbank->fetchObject();
/**
* $daten ist ein Array oder ein Objekt, indem die Ergebnisse der
* Datenbankabfrage gespeichert sind.
*/
// Code zum auslesen bzw. speichern der Daten ...
}
?>
Table Wizard
am 26.11.2009 - 08:51 Uhr
Was mir grad noch eingefallen ist, wenn du die Daten in der Drupal_DB abgelegt hast, dann dürfte die Ausgabe dieser mit Hilfe von Table Wizard nicht allzu schwer werden.
Danke stebeg! Werde mir das
am 26.11.2009 - 08:51 Uhr
Danke stebeg!
Werde mir das mal anschauen und ein wenig rumfriemeln...
Aber komme ich um das Modulschreiben nicht irgendwie herum? Wollte nicht unbedingt mehr Arbeit als nötig hereinstecken...
Könnte ich das nicht einfach als node speichern und diese Seite nur für Admin freigeben?
My software has no bugs - It just develops random features...
Zitat: Aber komme ich um
am 26.11.2009 - 09:47 Uhr
Aber komme ich um das Modulschreiben nicht irgendwie herum?
Naja, du musst das ganze ja auch irgendwie in die Drupal-DB kriegen. Wenn du kein eigenes Modul benutzt, dann musst du zu dieser Datenbank ja auch wieder per Hand eine Verbindung herstellen. Irgendwie unpraktisch, nich? :-)
Zudem hab ich quasi schon die Hälfte des Moduls gepostet. Und wo ich schon die ganze PHP-Klasse und so gepostet hab, da kann ich das jetzt auch noch kurz zeigen :-)
Als erstes Legst du einen Ordner mit dem Namen "my_mssql" an. In diesem Ordner erstellst du 2 Dateien: my_mssql.info und my_mssql.module
die my_mssql.info sieht dann so aus
; $Id: my_mssql.info
name = My MSSQL
description = Baut eine Verbindung zum MSSQL-Server auf und Speichert diese beim Cron-Lauf.
core = 6.x
die my_mssql.module sieht dann so aus
<?php
require_once 'mssql.class.php';
function my_mssql_cron()
{
$sql = "DEINE SQL-Anweisung";
$datenbank = new mssql(); //Objekt der MSSQL-Klasse - Verbindungsaufbau
$datenbank->query($sql);
$daten = $datenbank->fetchObject();
/**
* $daten ist ein Array oder ein Objekt, indem die Ergebnisse der
* Datenbankabfrage gespeichert sind.
*/
// Code zum auslesen bzw. speichern der Daten ...
}
?>
dann brauchst du nurnoch die PHP-Klasse, die ich gepostet hab und packst diese unter dem Namen mssql.class.php in den Ordner "my_mssql". Den ganzen Ordner kopierst du dann in /site/all/modules/ deiner Drupal Installation, aktivierst dieses Modul wie jedes andere auch aktiviert wird, führst den Cron aus und guckst obs funktioniert hat :-)
Aber nicht vergessen in der PHP-Klasse Datenbankname usw. und im Modul den Code fürs Auslesen und Speichern hinzuzufügen :-)
Nochamls besten Dank
am 26.11.2009 - 09:59 Uhr
Nochamls besten Dank stebeg!
Wenn du in/um Berlin wohnen solltest, lad ich dich gern mal auf'n Bier oder Kaffee ein ;)
Vermute mal mit deinen Tips dürftest du mir gut 80% des gesamten Aufwandes gespart haben...
Mach mich gleich mal an die Arbeit das umzusetzen.
My software has no bugs - It just develops random features...
Zitat: Wenn du in/um Berlin
am 26.11.2009 - 10:13 Uhr
Wenn du in/um Berlin wohnen solltest, lad ich dich gern mal auf'n Bier oder Kaffee ein ;)
Ich wohne dummerweise recht weit entfernt von Berlin, macht aber nix, da ich eh weder Kaffee noch Bier trinke :-)
stebeg schrieb Zitat: Wenn
am 26.11.2009 - 10:26 Uhr
Wenn du in/um Berlin wohnen solltest, lad ich dich gern mal auf'n Bier oder Kaffee ein ;)
Ich wohne dummerweise recht weit entfernt von Berlin, macht aber nix, da ich eh weder Kaffee noch Bier trinke :-)
Wo wohnst denn in etwa?
Wenn's nördlich von Berlin is, kann man darüber nochmal reden. Da bin ich regelmäßig am Wochenende (Bereich Wismar/Rostock, ab und an mal Hamburg. Bin quasi der "Traveling-Salesman" ;-) )
My software has no bugs - It just develops random features...
Ich muss euch deswegen
am 10.12.2009 - 11:19 Uhr
Ich muss euch deswegen nochmals belästigen wegen dem Modul:
Der "Einfachheit" halber habe ich alles in eine .module-Datei geschrieben.
Der Code:
<?php
//function hook_cron(){
mssql_pconnect("connection","user","pw") OR die('connect fehler');
mssql_select_db("DB") OR die('select db fehler');
mysql_pconnect("connection","user","pw") OR DIE("MySQL Database connection failed." . mysql_error());
mysql_select_db("drupal6") or DIE("MySQL DB unavailable." . mysql_error());
$sql_out='SELECT
[Tab1].[Name],
CONVERT (varchar(40),[Tab2].[Current Date],126),
[Tab2].[Missing Day],
[Tab2].[Employee No_]
FROM
[Tab2],
[Tab1]
WHERE
([Tab2].[Missing Day]="Urlaub" OR
[Tab2].[Missing Day]="Krank" OR
[Tab2].[Missing Day]="Berufssch.") AND
[Tab1].No_=[Tab2].[Employee No_] AND
([Tab2].[Current Date] BETWEEN getdate()-7 AND getdate()+28);';
$query = mssql_query($sql_out);
$sql_del= 'DELETE FROM fehlzeiten;';
mysql_query($sql_del) OR die('loeschen fehlgeschlagen' . mysql_error());
if(!mssql_num_rows($query))
{
echo "No records found";
}
else
{
while($row = mssql_fetch_row($query))
{
$Name = $row[0];
$Current_Date = $row[1];
$Missing_Day = $row[2];
$Employee_No = $row[3];
$sql_in = "INSERT INTO fehlzeiten VALUES ('$row[3]','$row[0]','$row[1]','$row[2]');";
mysql_query($sql_in) OR die('konnte nichts einfuegen ' . mysql_error());
}
}
//}
//hook_cron();
?>
Die .install-datei:
<?php
// $Id: my_mssql.install
/**
* Implementation of hook_install()
*/
function my_mssql_install() {
// Set the module weight so it can override other modules.
db_query("UPDATE {system} SET weight = 99 WHERE name = 'my_mssql'");
}
/**
* Implementation of hook_uninstall()
*/
function customsite_uninstall() {
// Remove the module from the system table
db_query("DELETE FROM {system} WHERE name = 'my_mssql'");
}
?>
Das ganze Prozedere funktioniert auch soweit.
Nur will ich das ganz gern NUR im Cron abfeuern und nicht bei jedem Seitenbesuch.
Das größte Problem macht aber derzeit das Filebrowser-Modul. Wird zum ersten Mal nach dem Login ein Pfad dort angewählt, erscheint eine Fehlermeldung "duplicate entry xy" dabei ist der Eintrag jedes Mal ein anderer.
So muss ich derzeit das einmal am Tag per Hand anstoßen, um die beiden DB synchron zu halten.
Ich versteh auch nicht, wieso sich der filebrowser und mein Modul sich gegenseitig behaken...
My software has no bugs - It just develops random features...
airliner schrieb Der
am 10.12.2009 - 11:28 Uhr
Der "Einfachheit" halber habe ich alles in eine .module-Datei geschrieben.
Das ist eine Vereinfachung, die du dir nicht leisten kannst.
<?php
function my_mssql_cron()
{
mssql_pconnect("connection","user","pw") OR die('connect fehler');
mssql_select_db("DB") OR die('select db fehler');
// TODO: Restlichen Code auch noch einfügen
}
?>
--
Zitat: Nur will ich das
am 10.12.2009 - 12:10 Uhr
Nur will ich das ganz gern NUR im Cron abfeuern und nicht bei jedem Seitenbesuch.
Einfach die ganze Prozedur in hook_cron packen oder diese über hook_cron aufrufen. Mit dem Modul Poormanscron kannst du dann festlegen in welchen Zeitabständen der Cron ausgeführt werden soll.
Drupal 7
am 24.04.2012 - 10:21 Uhr
Hallo zusammen,
sorry, dass ich einen so alten Post noch mal vorhole. Aber ich habe genau das gleiche Anliegen: ich möchte aus meiner Drupal-Installation heraus Daten aus einer mssql-Datenbank einbinden / Synchronisieren. Hauptunerschied: ich verwende Drupal 7.
Da ich leider überhaupt nicht in der PHP-Programmierung drin bin die Frage: Könnte der Code auch in Drupal 7 funktionieren? Oder müsste hier die Funktion angepasst werden?
Viele Grüße
woe wäre es damit?
am 24.04.2012 - 11:29 Uhr
http://drupal.org/project/sqlsrv
Das klingt nach dem richtigen Ansatz.
Grüße
Ronald
Auf Kommentar antworten
am 25.04.2012 - 08:47 Uhr
Nur will ich das ganz gern NUR im Cron abfeuern und nicht bei jedem Seitenbesuch.
Das größte Problem macht aber derzeit das Filebrowser-Modul. Wird zum ersten Mal nach dem Login ein Pfad dort angewählt, erscheint eine Fehlermeldung "duplicate entry xy" dabei ist der Eintrag jedes Mal ein anderer.So muss ich derzeit das einmal am Tag per Hand anstoßen, um die beiden DB synchron zu halten.
______________
christian louboutin peep toe pumps shoe ivory
chrispaul3 willian willian
Leider ist das keine Lösung.
am 22.05.2012 - 18:41 Uhr
Leider ist das keine Lösung. Ich betreibe Drupal 7 auf einem Debian Server mit MySQL. Es gibt aber auf einem Windows 2008 Server eine MS SQL-Datenbank mit Daten, die ich gerne regelmäß in Drupal einlesen möchte (als nodes). Der genannte Treiber lässt sich aber leider nur auf einem Windows-Betriebssystem installieren ;-(
Hat da jemand noch eine andere Idee?
Viele Grüße und einen schönen Abend
webservice
am 22.05.2012 - 19:02 Uhr
du könntest auf der Windowskiste einen webservice einrichten, der von Drupal aus angesprochen wird.
Oder aber der Service auf der Windowskiste spricht die mySQL-Datenbank auf dem Linuxserver an.
Wenn der Auskunftservice auch in eurer Regie liegt, könnt ihr dies direkt in den Service dieses Dienstes einhängen.
Auf diese Weise können auch Änderungen auf der Drupalseite in die Datenbank geschrieben werden.
Das hat den großen Vorteil, dass eine Umstellung auf welches System auch immer jederzeit möglich bleibt.
Grüße
Ronald