获取sql表的哈希(sha)

时间:2015-10-19 09:44:44

标签: sql hash signature

我有时会从一个非常古老的数据库(MS Access)中提取大量数据。序列化输出存储为YAML文件,其他脚本在本地使用这些文件以加快进程。

有时我们通过从数据库中提取(可能的)新数据来更新本地文件。这种提取很长,如果有关表的内容与最后一次提取相同,我想避免使用它。

是否有可能获得表格状态或表格的一部分的签名?

换句话说,这有助于理解我的问题:

signature = db.GetSignature('SELECT * FROM foo where bar = 1')
if local_foo.signature != signature:
    local_foo = db.Extract('SELECT * FROM foo where bar = 1')

我可以使用哪些解决方案?

1 个答案:

答案 0 :(得分:1)

使用触发器

如果您可以轻松控制原始Access数据库的插入/更新/删除功能,那么最佳/最安全的解决方案是实现数据库触发器以启用跟踪。这样,您可以轻松地至少存储“上次修改”值或保留一个表格,该表格负责存储大量跟踪信息。

不幸的是,Access不支持触发器(除非您使用2010+,请参阅下面的),但您可以在数据库中使用VBA实现触发器。

Access 2010介绍data macros,但我不认为这是一个选项!

使用脚本语言

如果你不能使用数据库触发器,也许你可以使用这样的工作流程:

  1. 执行查询并获取整个结果(单个集合)
  2. 将查询结果/集合转换为JSON字符串(例如Python中的json.dumps()
  3. 获取JSON字符串的哈希值(例如Python中的hashlib.sha1()& hashObject.hexdigest()
  4. 将哈希值与查询结果的最后存储哈希值进行比较。
  5. 使用VBA

    为了保持数据库端(避免传输数据),尝试在Access数据库中使用VBA生成哈希可能很有用。

    您可以使用此SO帖子中提到的散列算法代码:https://stackoverflow.com/a/14749855

    示例:

    使用此SHA1代码:https://gist.github.com/anonymous/573a875dac68a4af560d

    Dim d As DAO.Database
    Dim r As DAO.Recordset
    Dim s As String
    Set d = CurrentDb()
    Set r = d.OpenRecordset("SELECT foo, bar, baz FROM foobar")
    s = ""
    While Not r.EOF
        s = s & r!foo & "," & r!bar & "," & r!baz & ";"
        r.MoveNext
    Wend
    r.Close
    Set r = Nothing
    Set d = Nothing
    s = SHA1TRUNC(s)