Apache Hive上に登録されているすべてのテーブルをAccessのリンクテーブルとして一括登録するプログラムです。
前提として、Apache HiveのODBCドライバが導入済み、ODBC接続設定が完了している必要があります。
プログラム実行中に既にAccess上に登録済みのテーブルが出現した場合、リンクテーブルの更新は行わず、処理をスキップします。
更新を必要とする場合は、処理前に該当するAccess上のテーブルを削除してから処理を行ってください。
プログラム中のコメントとしても記述していますが、連続してリンクテーブルの追加処理を行っていると、1802回目の追加処理(TableDefs.Appendの呼び出し)で「実行エラー ‘3146’: ODBC–呼び出しが失敗しました。」というエラーが発生します。
復旧させるためには、いったんAccessを終了させ、Accessを再起動、データベースを開きなおすのがもっとも早いと思います。
Hive用としていますが、ODBC接続できるPostgreSQLやMySQLなどのRDBMSであれば、接続文字列部分のDriver部分に適切な値を変更することでHive以外のデータベースのリンクテーブル登録プログラムとしても使えると思います。
動作確認を行った環境:
Access 2013 / Windows 10 Pro バージョン:1703 ビルド:15063
Microsoft Hive ODBC Driver 2.01.05.1006 / Hortonworks Hive ODBC Driver 2.01.07.1010
2.8.1
2.3.0
PostgreSQL 9.6.3
' ' This software is distributed under the license of NYSL. ' ( http://www.kmonos.net/nysl/ ) Option Explicit Option Compare Database ' ======================================================================== ' ' 指定されたHiveデータベース上のテーブルをAccessのリンクテーブルとして ' 登録するAccess VBAモジュール ' ' ' ※注意 ' 実行前に[ツール]-[参照設定]メニューで「Microsoft Active X Data Object 6.0 Library」などの ' ライブラリを参照できるようにチェックすること。 ' ' Hive側のテーブル数が1802以上の場合、1802回目のCurrentDb.TableDefs.Appendの ' 処理で「実行エラー '3146': ODBC--呼び出しが失敗しました。」が発生 ' する。(Office 2013で確認) ' ' ======================================================================== Sub ConnectHiveTables() Dim hiveCs As String Dim adoCon As ADODB.Connection Dim adoRs As ADODB.Recordset Dim accessTableName As String Dim daoTableDef As DAO.TableDef Dim sourceTableName As String ' ODBC経由でHiveに接続するための接続文字列を設定 hiveCs = "DSN=ODBC_HIVE;Driver=Microsoft Hive ODBC Driver;UID=;PWD=;" ' Hiveに接続 Set adoCon = New ADODB.Connection adoCon.Open (hiveCs) ' Hive上のテーブル情報を取得 Set adoRs = adoCon.OpenSchema(adSchemaTables) Do While Not adoRs.EOF ' Access上のテーブル名を決定 accessTableName = adoRs.Fields("TABLE_SCHEMA") & "_" & adoRs.Fields("TABLE_NAME") ' Access上にテーブルが存在するかチェックし、存在する場合は処理を飛ばす If DCount("[Name]", "MSysObjects", "[Name] = '" & accessTableName & "'") = 1 Then Debug.Print "Skip" & vbTab & accessTableName GoTo NextTable End If ' リンクテーブルの接続先となるHive上のテーブル名を決定 sourceTableName = adoRs.Fields("TABLE_SCHEMA") & "." & adoRs.Fields("TABLE_NAME") ' リンクテーブルを作成 Set daoTableDef = CurrentDb.CreateTableDef(accessTableName) With daoTableDef .Connect = "ODBC;" & hiveCs .sourceTableName = sourceTableName End With CurrentDb.TableDefs.Append daoTableDef Debug.Print "Append" & vbTab & accessTableName & vbTab & "(source='" & sourceTableName & "')" NextTable: adoRs.MoveNext DoEvents Loop adoRs.Close adoCon.Close End Sub
Please give us your valuable comment