2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

« §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その1)) | トップページ | @アニメ(2011冬アニメOP、ED) »

2010年12月11日 (土)

§PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その2))

前回予告したalter table add constraint文の生成方法です。
pg_dumpから出力したファイルから生成します。VBAマクロは以下の通り。
セルにデータベース情報をセットしておくことが前提です。
仕様は、このマクロをmoduleに張り付けると、同じフォルダにpg_dumpの出力ファイルを
出力→読み込んでadd constraint文とdrop constraint文を生成して終了します。
pg_dumpは8.4.5で動作確認済みです。

Sub ボタン1_Click()
    lPgm = """C:\Program Files\PostgreSQL\8.4\bin\pg_dump.exe"""
    lOutTxt = ThisWorkbook.Path & "\pdmp.txt"           'pg_dump出力ファイル
    lAddConst = ThisWorkbook.Path & "\add_const.sql"    'add const文出力ファイル
    lDrpConst = ThisWorkbook.Path & "\drp_const.sql"    'drop const文出力ファイル名
    lhost = Range("C3").Value                           '接続先ホスト名
    lDB = Range("C4").Value                             '接続先データベース名
    lUser = Range("C5").Value                           'ユーザ名
   
    '1.pg_dump実行しDDL文出力
    rtn = Shell("cmd /c " & lPgm & " -U " & lUser & " -h " & lhost & " -s " & lDB & " >" & lOutTxt)
    waitTime = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 5)
    Application.Wait waitTime

   
    '2.DDLファイル開く
    Workbooks.OpenText Filename:=lOutTxt, StartRow:=1, DataType:= _
        xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
        Tab:=False, Semicolon:=False, Comma:=False, Space:=False, Other:= _
        False, FieldInfo:=Array(1, 2)
   
    Set rtn = ActiveSheet.Columns(1).Find("FOREIGN KEY", LookAt:=xlPart)
    If rtn Is Nothing Then GoTo p_end
   
       
    '3.add constraint/drop constraint文生成
    Close #1
    Open lAddConst For Output As #1
    Close #2
    Open lDrpConst For Output As #2
   
    Print #1, "\t"
    Print #2, "\t"
    Print #1, "set client_encoding='SJIS';"
    Print #2, "set client_encoding='SJIS';"
   
    lMax = Cells(65000, 1).End(xlUp).Row
    For i = rtn.Row To lMax
        lVal2 = Cells(i, 1).Value
        If lVal2 Like "*FOREIGN KEY*" Then
            lConstName = Trim(Left(lVal2, InStr(lVal2, "FOREIGN KEY") - 1))
            lConstName = Mid(lConstName, InStrRev(lConstName, " ") + 1)
            lVal1 = Cells(i - 1, 1).Value
            Print #1, "select '■" & Mid(lVal1, InStrRev(lVal1, " ") + 1) & "/" & lConstName & "' from pg_class limit 1;"
            Print #1, lVal1
            Print #1, lVal2
            Print #1, ""
            
            Print #2, "select '■" & Mid(lVal1, InStrRev(lVal1, " ") + 1) & "/" & lConstName & "' from pg_class limit 1;"
            Print #2, Replace(lVal1, "ONLY ", "") & " DROP CONSTRAINT " & lConstName & ";"
            Print #2, ""
            
        End If
    Next
    Print #1, "\t"
    Print #2, "\t"
    Print #1, "select count(*) as ""Constraint Count"" from pg_constraint where contype='f';"
    Print #2, "select count(*) as ""Constraint Count"" from pg_constraint where contype='f';"
   
    Close #1
    Close #2
    ActiveWorkbook.Close
   
p_end:
    Set rtn = Nothing
    MsgBox ThisWorkbook.Path & "に出力しました"
   
End Sub

« §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その1)) | トップページ | @アニメ(2011冬アニメOP、ED) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その1)) | トップページ | @アニメ(2011冬アニメOP、ED) »