【问题标题】:How to search for a string in the whole database?如何在整个数据库中搜索字符串?
【发布时间】:2009-02-11 13:21:09
【问题描述】:

我有一个由大量表组成的 informix 数据库。

我知道某个表中某处有一个字符串“example”,但不知道它是哪个表或哪个列。 (我知道这是非常罕见的情况)

由于表数量众多,无法手动查找。我如何在这个大型数据库中找到这个值?有什么查询可以找到吗?

提前致谢!

【问题讨论】:

  • 数据库有多大?
  • 不知道,但我们有数百张桌子。即使查询需要时间来运行,我们也负担得起。

标签: database search informix


【解决方案1】:

在 Informix 中,确定包含字符数据的列虽然很麻烦,但也是可行的。幸运的是,您不太可能使用诸如 DISTINCT TYPE 之类的深奥功能,这会使搜索变得更加困难。 (Alphadogg 的卸载建议 - 正如我在对他的回答的评论中所指出的那样使用 dbexport - 是有道理的,特别是如果文本可能出现在 CLOB 或 TEXT 字段中。)您需要知道类型 CHAR、NCHAR、VARCHAR、NVARCHAR 和LVARCHAR 的类型编号为 0、13、15、16 和 43。此外,如果列不是 NULL,则将 256 添加到编号中。因此,通过此查询可以找到数据库中的字符数据列:

SELECT t.owner, t.tabname, c.colname, t.tabid, c.colno
    FROM "informix".systables t, "informix".syscolumns c
    WHERE t.tabid = c.tabid
      AND c.coltype IN (0, 13, 15, 16, 43, 256, 269, 271, 272, 299)
      AND t.tabtype = 'T'  -- exclude views, synonyms, etc.
      AND t.tabid  >= 100  -- exclude the system catalog
    ORDER BY t.owner, t.tabname, c.colno;

这会生成要搜索的地点列表。您可能会喜欢并让 SELECT 生成一个适合作为查询重新提交的字符串 - 留给读者作为练习。

【讨论】:

    【解决方案2】:

    通常,您有两种方法。

    一种方法是将每个表转储到单独的文本文件并 grep 文件。这可以在小型数据库上手动完成,或者在较大数据库的情况下通过脚本完成。查看 UNLOAD 和 dbaccess。 BASH 脚本中的示例:(您需要在脚本中静态或通过查询生成表列表。)

    unload_tables () {
    
    for table in ${TABLE_LIST} do
        dbaccess database_name << EOF
        unload to "${OUT_PATH}/${table}/.out"
        select * from $table;
        EOF
    done
    }
    

    或者,这有点复杂。您可以使用systablessyscolumns 以类似的自动化方式为数据库中的每个表和列创建特定的SELECT(按“示例”过滤每一列),然后运行每个sql。

    例如,此查询显示所有表中的所有列:

    SELECT tabname, colno, colname, coltype, collength
    FROM systables a, syscolumns b 
    WHERE a.tabid = b.tabid
    

    调整这一点很容易,这样 SELECT 会返回一个格式正确的 SQL 字符串,允许您查询数据库以匹配“示例”。抱歉,我没有现成的完整解决方案,但如果您在 Google 上搜索“informix systables syscolumns”,您会看到很多方法可以使用这些信息。

    【讨论】:

    • Informix 有一个“dbexport”命令。它将创建一个 dbase.exp 目录,该目录中的文件中包含卸载的数据。搜索文件,找到您的示例,映射回原始表。
    • 注意tabid嵌入在文件名的5位数字中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2013-05-29
    • 1970-01-01
    • 2018-07-25
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多