2016-03-23 6 views
0

Ich möchte ein Skript schreiben, entweder Perl oder Bash, wo ich eine oder mehrere Wählen Sie SQL-Anweisungen, um einige Informationen aus einer Datenbank auf einem Remote-Server zu erhalten.Ausführen von SQL-Anweisung von Bash oder Perl Script?

Derzeit kann ich GUI-Tools wie RazorSQL und DbVisualizer verwenden, um eine Verbindung zur Datenbank herzustellen und Tabellen anzuzeigen, SQL-Befehle auszuführen usw. Aber ich möchte versuchen, einige SQL-Befehle aus einem Skript auszuführen, damit ich das verwenden kann ergibt sich aus den cmds in einem Bash/Perl Script.

der Server die Datenbank läuft, hat die folgenden Angaben:

  • Betriebssystem: Microsoft Windows Server 2003 RS Standard Edition SP2
  • Datenbank: Microsoft SQL Server 2005

Beim Verbinden mit der Datenbank unter Verwendung von RazorSQL auf einem Windows-PC verwendet meine Verbindung den Treiber "net.sourceforge.jt" ds.jdbc.Driver ".
Dann, wenn ich DbVisualizer auf meiner Linux-Box verwende ich den JDBC-Treiber "SQL Server (jTDS)", die beide scheinen gut zu funktionieren.

So in einem Versuch, diese von Perl zu versuchen, die ich heruntergeladen habe die folgenden Pakete:

  • unixODBC
  • FreeTDS
  • sqsh --->* aber konnte ich es nicht wegen kompiliert erhalten Sybase ...
  • Die Perl-Module: DBD :: ODBC, JDBC DBD :: DBI

Zur Installation, Test und Inbetriebnahme unixODBC verwendet habe ich diese Seite: http://www.easysoft.com/developer/languages/perl/dbd_odbc_tutorial_part_1.html
und verwenden diese Website: http://www.unixodbc.org/doc/UserManual/, zu DSNs hinzufügen ...

Nun versuchte ich hier diese Richtungen zu verwenden: http://www.freetds.org/userguide/perl.htm, in die Datenbank von Perl zu verbinden , aber ich habe Probleme, es zu verbinden.

Kann mir jemand sagen, ob ich auf dem richtigen Pfad dafür bin, oder wie meine connect() - Zeichenfolge aussehen soll ...? In RazorSQL die JDBC „URL“ sieht wie folgt aus:

jdbc:jtds:sqlserver://192.168.2.200:1433/ActiveDB;appName=RazorSQL;useCursors=true 

Und ich bin verwirrt, wie ein DSN zu verwenden, die ich mit dem GUI-Befehl ODBCConfig aus dem Perl-Script erstellt ... Ich bin Probleme bei der Suche nach einem realen Beispiel für die Verbindung zu MS SQL Server in Perl.

Die Datei mit dem Treiber-Eintrag wie folgt aussieht: odbcinst.ini

[MySQL ODBC 3.51.27r695 Driver] 
Driver  = /usr/lib/unixODBC/libmyodbc3.so 
Setup  = /usr/lib/unixODBC/libmyodbc3S.so 
UsageCount = 1 

[JDBC/ODBC bridge driver for java-1_6_0-sun] 
Driver  = /usr/lib/jvm/java-1.6.0-sun-1.6.0/jre/lib/i386/libJdbcOdbc.so 
Setup  = /usr/lib/jvm/java-1.6.0-sun-1.6.0/jre/lib/i386/libJdbcOdbc.so 
UsageCount = 1 

[TDS Driver] 
Driver  = /usr/lib/unixODBC/libtdsS.so 
Setup  = /usr/lib/unixODBC/libtdsS.so 
UsageCount = 1 

[net.sourceforge.jtds.jdbc.Driver] 
Driver  = /opt/jtds-1.3.1/jtds-1.3.1.jar 
Setup  = /opt/jtds-1.3.1/jtds-1.3.1.jar 
UsageCount = 1 

* Die letzten in dieser Liste die gleichen Treiber von RazorSQL verwendet, aber da es eine JAR-Datei Ich denke, es kann nur mit Java-Programmen verwendet werden ...

Und das ist in ~/.odbc.ini

[MyDB] 
Driver  = /usr/lib/unixODBC/libtdsS.so 
Description = 
SERVER  = serverName.foo.bar.local 
PORT  = 1433 
USER  = user1 
Password = abc123 
Database = ActiveDB 

Da, wie soll mein "connect()" string Blick in Perl, und würde, dass der richtige Treiber zu verwenden. ..?

Ich bin neu beim Versuch, dies mit einem Skript, und mein Kopf dreht sich derzeit mit Informationen .... Also jede Hilfe, die jemand anbieten könnte würde sehr geschätzt werden!

Antwort

0

Nach ein wenig Durchsuchen der DBD :: ODBC-Dokumentation fand ich einige Beispiele. This one tut folgendes (Ich habe einige Teile entfernt, das ist kein wörtliches Zitat).

my $dsn = "DRIVER={SQL Server};SERVER=$options{DbSrcServer};DATABASE=$options{DbSrcDatabase};NETWORK=dbmssocn;UID=$options{DbSrcLoginName};PWD=$options{DbSrcPassword}"; 
my $dbh = DBI->connect("DBI:ODBC:$dsn") || die "DBI connect failed: $DBI::errstr\n"; 
$dbh->{AutoCommit} = 0;  # enable transactions, if possible 
$dbh->{RaiseError} = 0; 
$dbh->{PrintError} = 1;  # use RaiseError instead 
$dbh->{ShowErrorStatement} = 1; 

Leider gibt es keine echten Erklärungen in der Treiber-Dokumentation, also lassen Sie uns damit gehen. Wir wissen, dass es eine DRIVER= und eine SERVER= und so weiter gibt. Diese sind auch in Ihrem odbc.ini vorhanden, also sollten Sie sie versuchen.

my $dsn = "DRIVER=/usr/lib/unixODBC/libtdsS.so;SERVER=serverName.foo.bar.local;PORT=1433;DATABASE=ActiveDB;UID=user1;PWD=abc123"; 

Haftungsausschluss: Ich kann das nicht testen können, und ich habe keine Ahnung, ob es funktioniert. Es ist nur eine begründete Vermutung, dass ich es versuchen würde.


Sie können auch versuchen, DBD :: JDBC verwenden, die relativ einfach klingt. This part of its docs describe the dsn. Aber Sie brauchen ein paar Abhängigkeiten. Ich glaube aber, dass Sie schon einige davon abgedeckt haben.

+0

Wenn es nicht funktioniert, werde ich diese Antwort löschen. – simbabque

+0

Danke für die Antwort simbabque, ich schätze wirklich die Hilfe ..! Das hat nicht genau funktioniert. Ich habe einen Fehler in der DBI-Verbindungsleitung erhalten, der besagt: "failed: [unixODBC] [Driver Manager] Datenquellenname nicht gefunden und kein Standardtreiber angegeben (SQL-IM002)" ... Das hat mich zum Nachdenken gebracht, und ich Ersetzte das gesamte '$ dsn =" ... "' mit nur dem Namen des DSN, \ * ie "[MyDB]" .. Also hatte ich 'my $ dsn =" MyDB ";. Und dieses Mal hat der Befehl lange gedauert, bis er scheiterte, und diesmal bekam ich einen anderen Fehler: "Verbindung zum MySQL-Server verloren bei 'initialem Kommunikationspaket lesen', Systemfehler: 104" – Matt

+0

Warum sollte er versuchen, eine Verbindung zu MySQL herzustellen? ? Sprechen wir nicht über einen Microsoft SQL Server? – simbabque

0

Alrighty ... Ich glaube, ich habe das funktioniert. Danke nochmal Simbadque für Vorschläge, ich schätze es sehr, dass du dir die Zeit nimmst um zu helfen!

Ich war so durcheinander und drehte mich während all dem um, ich war mir nicht einmal sicher, welcher Weg UP war ... Also beschloss ich, alles zu ignorieren, was ich bisher getan hatte, und fing an, das zu betrachten nochmal. Und ich fand ein EXCELLENT guide jemand schrieb für genau das, was ich tun wollte (* shocker ...) !!

fand ich diese Anweisungen auf PerlMonks.org auf den unten stehenden Link (* Ich weiß, dass der Titel ziemlich offensichtlich ist): Zugriff auf Microsoft SQL Server von Linux mit DBD :: Sybase ->http://www.perlmonks.org/?node_id=392385

Grundsätzlich, kurz gesagt, ich brauchte folgendes zu tun:

  1. Uninstall FreeTDS: ich ne EDED eine make uninstall im Quellverzeichnis zu tun, wo ich ursprünglich kompiliert/installiert es aus ...

  2. Re-Compile & Re-Install FreeTDS: rekonfiguriert freetds mit diesem als der Befehl configure ->./configure --prefix=/usr/local/freetds --with-tdsver=7.0.

  3. Konfigurieren Sie FreeTDS.conf(* nach make install) : hinzugefügt, um die Konfigurationsdatei die folgenden Zeilen: try server login = yes try domain login = no tds version = 7.0
    Diese Zeilen machen, damit es die Datenbank-Login creds und die Windows-Domain Login-Infos verwendet. Und tds Version 7 sagt freetds welche Version an die DB verbinden mit und lesen, dass Version 7 für SQL Server-Versionen neuer als MS SQL Server 2000 ...

  4. erstellen Server Eintrag in freetds. conf: Ich habe die folgenden Zeilen hinzugefügt, um meinen Server mit der MS SQL Server 2005-Datenbank hinzuzufügen.
    [mydb] host = jwp-eim02.paoli.jwpepper.local port = 1433 tds version = 8.0

  5. Test „mydb“ Entry:/usr/local/freetds/bin/tsql -S mydb -U sqlUsername Nach diesem Befehl ausführt Ich werde nach einem Passwort gefragt und dann bekomme ich eine Eingabeaufforderung, die wie „1>“ sieht, was Sie es angemeldet erzählt -in erfolgreich.!

  6. Schließlich, Test in Perl:* Unter dem Codebeispiel ist ich verwendet, um Daten aus der SQL Server-Datenbank zu erhalten ...

    #!/usr/bin/perl 
    
    use DBI; 
    
    $dsn = 'DBI:Sybase:server=mydb'; 
    
    my $dbh = DBI->connect($dsn, "sqlUsername", 'sqlUserPwd'); 
    die "unable to connect to server $DBI::errstr" unless $dbh; 
    
    $dbh->do("use DatabaseName"); 
    
    $query = "Select * from EXAMPLE_TABLENAME"; 
    $sth = $dbh->prepare ($query) or die "prepare failed\n"; 
    $sth->execute() or die "unable to execute query $query error $DBI::errstr"; 
    
    $rows = $sth->rows ; 
    print "$row rows returned by query\n"; 
    
    while (@first = $sth->fetchrow_array) { 
        foreach $field (@first) { 
         print "field: $field\n"; 
        } 
    } 
    

ich ausgeführt dann, dass Perl-Skript und VIOLA...!! Ich habe Daten von der Select-Anweisung erhalten!

Hoffentlich hilft dies jemand anderen, der das gleiche macht ... Und ich denke, wenn ich das mit etwas wie Bash machen wollte, könnte ich wahrscheinlich einen der Befehle benutzen, die mit FreeTDS kamen, wie tsql, osql, etc ... Aber ich bin nicht davon überzeugt.