ADO(CHECK
の制約、WITH COMPRESSION
など)とACEDAO(複雑なデータ型などに必要なもの)の両方を使用している場合でも、テーブルのスキーマをすべて抽出したことを確認できないことに注意してください。
ここでそのような表の例は次のとおり
Sub CantGetCheck()
On Error Resume Next
Kill Environ$("temp") & "\DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
With .ActiveConnection
Dim Sql As String
Sql = _
"CREATE TABLE Test " & _
"(" & _
" data_col INTEGER NOT NULL, " & _
" CONSTRAINT data_col__be_positive " & _
" CHECK (data_col >= 0), " & _
" CONSTRAINT data_col__values " & _
" CHECK (" & _
" data_col = 0 OR data_col = 1 OR data_col = 2 " & _
" OR data_col = 3 OR data_col = 4 OR data_col = 5 " & _
" OR data_col = 6 OR data_col = 7 OR data_col = 8 " & _
" OR data_col = 9 OR data_col = 10 OR data_col = 11 " & _
" OR data_col = 12 OR data_col = 13 OR data_col = 14 " & _
" OR data_col = 15 OR data_col = 16 OR data_col = 17 " & _
" OR data_col = 18 OR data_col = 19 OR data_col = 20 " & _
" ) " & _
");"
.Execute Sql
Dim rs
' 5 = adSchemaCheckConstraints
Set rs = .OpenSchema(5)
MsgBox rs.GetString
End With
Set .ActiveConnection = Nothing
End With
End Sub
出力は示していdata_col__be_positive
指定された制約の定義が実際に抽出することができるが、data_col__values
定義できない(それは255文字を超えているため)。
本当に解決策は、作成してその後テーブルを変更する際に使用したコードを常に保持することです。私のために、目的のためにSQL DDLスクリプトを使用することは非常に意味があります(私はDDLを介して作成できないいくつかの機能は必要ありません)。
テーブルスキーマだけをコピーするか、テーブルスキーマ*とそのデータを必要とするかは言及していません。 –