2016-03-23 25 views
0

Bir veya daha fazla çalıştırabilir bir Komut dosyası, bir Uzak Sunucuda bir veritabanı kapalı bir bilgi almak için SQL deyimleri seçin.SQL ifadesini Bash veya Perl Script'den çalıştırma?

Şu anda Veritabanı'na bağlanmak ve Tabloları görüntülemek, SQL komutlarını çalıştırmak vb. Için RazorSQL ve DbVisualizer gibi GUI Araçları'nı kullanabilirim. Ancak, bir komut dosyasından SQL komutlarını çalıştırmayı denemek istiyorum. Bash/Perl Scriptindeki cmds sonuçları.

Veritabanı çalışan Sunucu sahiptir aşağıdaki ayrıntıları:

  • İşletim Sistemi: Microsoft Windows Server 2003 RS Standard Edition SP2
  • Veritabanı: Microsoft SQL Server 2005

Bir Windows PC'de RazorSQL kullanarak Veritabanına bağlanırken, bağlantım Sürücü kullanır "net.sourceforge.jt ds.jdbc.Driver ".
Sonra, linux kutusuna DbVisualizer kullanırken her ikisi de gayet iyi çalışıyor gibi JDBC Sürücüsü "SQL Server (jTDS)" kullanın.

  • unixODBC
  • FreeTDS
  • SQSH --->* ancak, bunun yüzünden derlenmiş alamadı:

    Yani Perl bu denemek için bir girişim aşağıdaki Paketleri indirilen Sybase ...
  • Perl Modülleri: DBD :: ODBC, DBD :: JDBC, DBII

Perl gelen Veritabanına bağlanmak için http://www.freetds.org/userguide/perl.htm:

Şimdi burada bu talimatları kullanmaya çalıştı ... http://www.unixodbc.org/doc/UserManual/, DSN eklemek için: test ve kurulum unixODBC yüklemek için bu siteyi kullandı: http://www.easysoft.com/developer/languages/perl/dbd_odbc_tutorial_part_1.html
Ve bu siteyi kullanılan ama bağlantı kurmak için biraz sorun yaşıyorum.

Bunun için doğru yolda olduğumu veya connect() dizesinin neye benzemesi gerektiğini ... bana söyleyebilir misiniz? Ben ...

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

Ve ben Perl script içinden GUI komutu ODBCConfig ile oluşturulan bir DSN nasıl kullanılacağı konusunda kafam karıştı: razorsql olarak JDBC "URL" şuna benzer Perl'de MS SQL Server'a bağlanmak için gerçek bir yaşam örneği bulmakta zorlanıyor.

gibi Sürücüleri listeleme dosya görünür: 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 

* Bu listedeki sonuncusu razorsql tarafından kullanılan aynı Sürücü, ama bunu tahmin bir kavanoz dosya beri sadece Java programları ile kullanılabilir ...

Ve bu içindedir ~/.odbc.ini

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

Verilen benim Perl dize göz "() bağlamak" olmalı ve bu doğru Sürücü kullanmak olacaktır nasıl olduğunu. ..?

Bunu bir Komut Dosyası ile denemede yeniyim ve başım şu anda bilgi ile dönüyor .... Bu yüzden birisinin önerebileceği herhangi bir yardım büyük beğeni topladı!

cevap

0

DBD :: ODBC belgelerine göz gezdirdikten sonra bazı örnekler buldum. This one aşağıdakileri yapar (bazı bölümleri kaldırdım, bu bir alıntı değil).

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; 

Ne yazık ki, sürücü belgelerinde gerçek bir açıklama yok, bu yüzden bununla devam edelim. DRIVER= ve SERVER= ve benzeri olduğunu biliyoruz. Bunlar ayrıca odbc.ini adresinde de mevcut. Bu yüzden bunları denemelisiniz.

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

Yasal Uyarı: Bunu test edemez ve eğer çalışırsa, hiçbir fikrim yok. Sadece deneyeceğim bir eğitimli tahmin.


Ayrıca nispeten daha kolay geliyor DBD :: JDBC, kullanmayı da deneyebilirsiniz. This part of its docs describe the dsn. Ama birkaç bağımlılığa ihtiyacın var. Yine de bunların bir kısmını kapladığına inanıyorum.

+0

Çalışmıyorsa, bu yanıtı silerim. – simbabque

+0

Cevap simbabque için teşekkürler, gerçekten yardım için teşekkür ederiz ..! Bu tam olarak işe yaramadı. DBI bağlantı satırında hata alıyorum: "başarısız: [unixODBC] [Sürücü Yöneticisi] Veri kaynağı adı bulunamadı ve varsayılan sürücü belirtilmedi (SQL-IM002)" ... Bu yüzden beni düşündü ve ben '$ dsn = "..." 'ifadesinin tamamı, yalnızca DSN adıyla değiştirildi, \ * "[MyDB]" .. Bu yüzden benim $ dsn = "MyDB"; Ve bu sefer komut sonunda başarısız oldu ve bu sefer farklı bir hata aldım: "İlk iletişim paketini okuyarak" MySQL sunucusuna bağlantı koptu, sistem hatası: 104 " – Matt

+0

Neden MySQL'e bağlanmayı dener? ? Microsoft sql sunucusundan bahsetmiyor muyuz? – simbabque

0

Pekala ... Bu işe sahip olduğuma inanıyorum. Önerileriniz için tekrar teşekkürler Simbadque, Size yardımcı olmak için zaman ayırdığınız için çok teşekkür ederim!

Tüm bu süreçte çok karışık ve etrafta gezindim, artık yolun nasıl olduğu konusunda emin değildim ... Bu yüzden şimdiye kadar yaptığım her şeyi görmezden gelmeye karar verdim. tekrar. Ve ben tam olarak ne istediğimi yapmak için yazmış bir MÜKEMMEL kılavuz bulmaktan sona erdi (* shocker ...)! ->http://www.perlmonks.org/?node_id=392385

DBD :: Sybase kullanarak Linux Microsoft SQL Server erişme:

ben (* Ben başlık çok açıktır biliyorum) aşağıdaki bağlantıdan PerlMonks.org üzerinde bu talimatları bulundu

  1. Kaldırma FreeTDS:

    Temelde, kısacası, şu yapmak için gerekli Ben nE eded Başlangıçta derlenmiş kaynak dizininde bir make uninstall yapmak/... onu yüklü

  2. Yeniden Derleme & Yeniden Yükleme FreeTDS: yapılandırmak komutu olarak kullanıyor yeniden freetds ->./configure --prefix=/usr/local/freetds --with-tdsver=7.0.

  3. FreeTDS'i yapılandırın.conf(* make install sonra) : config dosyasına Eklendi aşağıdaki satırları: Bu bilgi giriş, Windows Domain Veritabanı giriş creds kullanır ve NOT böylece try server login = yes try domain login = no tds version = 7.0
    Bu satırlar yapmak. Ve

  4. freetds bir sunucu Girişi Oluştur ... ile DB bağlanmak ve bu sürüm 7 yeni MS SQL Server 2000 sonra SQL Server sürümleri içindir okumak için hangi sürümünü sürüm 7 freetds söyler tds. conf: Sunucumı MS SQL Server 2005 Veritabanını çalıştıran eklemek için aşağıdaki satırları ekledim.
    [mydb] host = jwp-eim02.paoli.jwpepper.local port = 1433 tds version = 8.0

  5. Testi "Mydb" Giriş:/usr/local/freetds/bin/tsql -S mydb -U sqlUsername Ben bir parola sorulur olsun ve sonra ben onu açmış anlatır "1>" benzeyen bir komut istemi, olsun bu komutu çalıştırdıktan sonra -başarıyla!

  6. Son olarak, test Perl:* Aşağıda ben SQLServer veritabanından veri almak için kullanılan örnek kod ...

    #!/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"; 
        } 
    } 
    

olduğunu o zaman idam olduğunu Perl script ve VİYOLA...!! Seçim Bildirimi'nden veri aldım!

İnşallah bu, aynı şeyi yapmak isteyen başka birine yardım eder ... Ve sanırım Bash gibi bir şeyle bunu yapmak isteseydim, muhtemelen, tsql, osql gibi FreeTDS ile gelen komutlardan birini kullanabilirim. vb ... Ancak, bunun hakkında olumlu değilim.

İlgili konular