我有一个MDB文件,其中包含许多表和表格。每个字段都有一个验证规则,例如Is Null Or >=0 And <=255
。
此访问数据库正在使用MySQL转换为在线系统。使用MDBTools(https://github.com/brianb/mdbtools)可以轻松导出所有数据。
但是我找不到导出验证规则的任何方法。超过100个表中有成千上万个字段,因此,导出和导入它们而不是重写每个表很重要。
我真的不介意它们以什么格式导出,任何文本格式都可以,所以我可以做一个正则表达式,否则就可以了。
但是,在导出这些验证规则时,我一直找不到任何信息。
也许如果默认情况下未将其内置到访问中,则可以使用VB脚本来查找信息并将其写入文本文件?我对访问或Windows并不十分熟悉,所以如果有人可以建议那是否是一个很好的可能性。
答案 0 :(得分:2)
使用VBA可以直接检索字段验证规则。
我知道现在为您提供帮助可能为时已晚。并且,尽管对于不熟悉Access和VBA的人来说似乎不合适,但是这种方法只需要一个表,将下面的代码复制到标准模块中并运行它。这样其他人可能会受益。
我创建了我的表 field_validation_rules ,用于存储验证规则属性的文本。该表包含3个文本字段: table_name ; field_name ;和 validation_rule 。
Public Sub GatherValidationRules()
Dim db As DAO.Database
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Dim tdf As DAO.TableDef
Set db = CurrentDb
Set rs = db.OpenRecordset("field_validation_rules", dbOpenTable, dbAppendOnly)
For Each tdf In db.TableDefs
If Not (tdf.Name Like "~*" Or tdf.Name Like "MSys*") Then
For Each fld In tdf.Fields
If Len(fld.ValidationRule) > 0 Then
rs.AddNew
rs!table_name.Value = tdf.Name
rs!field_name.Value = fld.Name
rs!validation_rule.Value = fld.ValidationRule
rs.Update
End If
Next
End If
Next
rs.Close
End Sub
ValidationRule
属性是一个字符串值。如果尚未为给定字段分配属性,则ValidationRule
是一个空字符串。该代码跳过了这些代码,仅存储为其分配了字段的验证规则。
如果要将收集的验证规则存储在文本文件中,则有几个选项。我这样将我的数据转储为CSV:
DoCmd.TransferText acExportDelim, , "field_validation_rules", "C:\share\Access\field_validation_rules.txt", False
答案 1 :(得分:0)
对于任何其他发现此问题的人来说,这就是我结束工作的方式。这是在Access 2003中,在其他版本中可能有所不同。
首先,我去Tools > Analyze > Documenter
选择了我想要的表并使用了以下设置:
然后向我展示了看起来像pdf或word doc的文件(我认为不是,但这并不重要)。
然后我做File > Export
并选择“文本文件.txt”并将其保存到计算机上的某个位置。
然后我用PHP打开.txt文件(可以在任何可以执行正则表达式的地方都可以)。
在我的实例中,不是每个字段都有验证规则,如果未设置验证规则,则不会出现,这意味着用于获取fieldID的正则表达式比获取验证规则具有更多的结果。
所以我用了两个正则表达式。
/SourceField:\s+(\S+).*?AllowZeroLength/msi
这将获取SourceField和AllowZeroLength之间的所有内容。验证规则之后,AllowZeroLength是重复文本的第一位。
然后我使用此正则表达式从该字符串中获取验证规则。
/ValidationRule:\s+(.*)\\r/
我必须使用\r
而不是换行,这可能与将其从Windows迁移到Ubuntu有关。
在PHP中,它看起来像这样:
<?php
$file_contents = file_get_contents('validations.txt');
$response = [];
preg_match_all('/SourceField:\s+(\S+).*?AllowZeroLength/msi', $file_contents, $matches);
for($i = 0; $i < count($matches[0]); $i++) {
$id = $matches[1][$i];
preg_match('/ValidationRule:\s+(.*)\\r/', $matches[0][$i], $validation_match);
$response[$id] = $validation_match[1] ?? null;
}
几乎可以肯定有一个比这更干净的正则表达式,但这非常快,我完全可以得到我想要的。