masalibの日記

システム開発、運用と猫の写真ブログです

知らなかったシステムのDBの調査の時に使ったコマンド

masalib.hatenablog.com

上記の作業で調査時に使ったSQLを残す
二度と使いたくないけどが・・・

DB内のカラムを取得する方法

select * from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = 'dbname'
order by TABLE_NAME;

このデータと設計書をマッチング処理を作ってチェックした

DB内の全インデックスの一覧を取得する方法


select table_schema,table_name,index_name,column_name,seq_in_index from information_schema.statistics
where table_schema = "DBName"
and index_name <> 'PRIMARY'
and index_name like 'IX%'
order by table_name,index_name,seq_in_index
;

DB内のユニークカラムを探す

select table_schema,table_name,index_name,column_name,seq_in_index from information_schema.statistics
where table_schema = "DBName"
and index_name <> 'PRIMARY'
and not(index_name like 'IX%')
order by table_name,index_name,seq_in_index
;




インデックスはとれないので取得して目視で確認した
設計書と現在の内容のチェックはツール作るほど貼っていなかった

DB内の外部キー制約一覧

SELECT
F1.TABLE_SCHEMA AS TABLE_SCHEMA
,F1.TABLE_NAME AS TABLE_NAME
,F1.COLUMN_NAME AS COLUMN_NAME
,F2.CONSTRAINT_TYPE AS CONSTRAINT_TYPE
,F2.CONSTRAINT_NAME AS CONSTRAINT_NAME
FROM
information_schema.KEY_COLUMN_USAGE F1
LEFT JOIN information_schema.TABLE_CONSTRAINTS F2 ON F1.TABLE_SCHEMA = F2.TABLE_SCHEMA
AND F1.CONSTRAINT_NAME = F2.CONSTRAINT_NAME
WHERE
F2.CONSTRAINT_TYPE = 'FOREIGN KEY'
;

目視でも確認したが
0件だった

f:id:masalib:20170825190404p:plain
テーブル設計はエクセルのシート単位に分かれているので
シートを結合する処理をつくった

Sub sh_check()
  Dim newSh As String
  Dim Sh As Worksheet, myFlag As Boolean
    newSh = "全データ"
    myFlag = False
    For Each Sh In ThisWorkbook.Worksheets
        If Sh.name = newSh Then
            myFlag = True
            '----全データシートのデータをクリアし、先頭へ移動します
            Worksheets(newSh).Cells.ClearContents
            Worksheets(newSh).Move before:=Sheets(1)
            Exit For
        End If
    Next Sh
    '----全データシートを先頭へ追加します
    If myFlag = False Then
        ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).name = newSh
    End If
End Sub

Sub matome()
  Dim i As Integer
  Dim lRow As Long, lCol As Long, lRow2 As Long
  Dim iMatomeCount As Integer
  Dim wsMatomeData As Worksheet
  
  Dim strWorkTableName As String
  
    Application.ScreenUpdating = False
     '----全データシートの有無をチェックします
    sh_check
    '----列見出しをコピーします
    Set wsMatomeData = Worksheets(1)
    wsMatomeData.Cells(1, 1).Value = "テーブル名"
    wsMatomeData.Cells(1, 2).Value = "順番"
    Worksheets(4).Range("(A6:G6)").Copy Worksheets(1).Range("C1")
    '日本語カラム名	カラム名	型	長さ	インデックス	NULL	備考をコピー
    iMatomeCount = 2
    
    For i = 1 To Worksheets.Count
        With Worksheets(i)
             If Worksheets(i).name = "全データ" Or Worksheets(i).name = "全データ (差分用)" Or Worksheets(i).name = "一覧" Or Worksheets(i).name = "memcache一覧" Then
             ElseIf Worksheets(i).name = "template" Then
             Else
             
                 strWorkTableName = Worksheets(i).Cells(3, 6).Value
                 Debug.Print strWorkTableName
                 
                 For lRow = 7 To 100
                    If Worksheets(i).Cells(lRow, 2).Value = "" Then
                    Else
                         
                         Debug.Print strWorkTableName & ":" & Worksheets(i).Cells(lRow, 2).Value
                    
                        wsMatomeData.Cells(iMatomeCount, 1).Value = strWorkTableName
                        wsMatomeData.Cells(iMatomeCount, 2).Value = lRow - 6
                        
                        wsMatomeData.Cells(iMatomeCount, 3).Value = Worksheets(i).Cells(lRow, 1).Value
                        wsMatomeData.Cells(iMatomeCount, 4).Value = Worksheets(i).Cells(lRow, 2).Value
                        wsMatomeData.Cells(iMatomeCount, 5).Value = Worksheets(i).Cells(lRow, 3).Value
                        wsMatomeData.Cells(iMatomeCount, 6).Value = Worksheets(i).Cells(lRow, 4).Value
                        wsMatomeData.Cells(iMatomeCount, 7).Value = Worksheets(i).Cells(lRow, 5).Value
                        wsMatomeData.Cells(iMatomeCount, 8).Value = Worksheets(i).Cells(lRow, 6).Value
                        wsMatomeData.Cells(iMatomeCount, 9).Value = Worksheets(i).Cells(lRow, 7).Value
                        
                        iMatomeCount = iMatomeCount + 1
                    
                    
                    End If
                 Next lRow
             End If
            
        End With
        'GoTo TestContenueLabel
    Next i
    
    TestContenueLabel:     'デバック用で使った
    
    Worksheets(1).Activate
    Range("A1").Select
    Application.ScreenUpdating = True
End Sub

ストアドの確認

SHOW PROCEDURE STATUS;

もしあったら
SHOW CREATE PROCEDURE sample01;