我有一个包含大量表格的informix数据库。
我知道某个表中某处有一个字符串“example”,但不知道它是哪个表或者是哪个列。 (我知道这是一种非常罕见的情况)
由于表的数量很多,因此无法手动查找。如何在这个大型数据库中找到这个值?有任何查询可以找到吗?
提前致谢!
答案 0 :(得分:3)
在Informix中,确定包含字符数据的列是繁琐但可行的。幸运的是,你不太可能使用像DISTINCT TYPE这样的深奥功能,这会使搜索变得更难。 (Alphadogg建议卸载 - 正如我在他对他的回答的评论中所说的那样使用dbexport - 这是有道理的,特别是如果文本可能出现在CLOB或TEXT字段中。)你需要知道类型CHAR,NCHAR,VARCHAR,NVARCHAR和LVARCHAR的类型编号为0,13,15,16和43.此外,如果列为NOT 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生成一个适合重新提交的字符串作为查询 - 这是留给读者的练习。
答案 1 :(得分: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
}
或者,这有点复杂。您可以使用systables
和syscolumns
以类似的自动方式为数据库中的每个表和列创建一个特定的SELECT(按“example”过滤每一列),然后运行每个sql。
例如,此查询显示所有表中的所有列:
SELECT tabname, colno, colname, coltype, collength
FROM systables a, syscolumns b
WHERE a.tabid = b.tabid
很容易对此进行调整,以便SELECT返回一个正确的格式化SQL字符串,允许您查询数据库中的“示例”匹配项。对不起,我没有准备就绪的完整解决方案,但如果你谷歌搜索“informix systables syscolumns”,你会看到很多方法可以使用这些信息。