横向进某系统拿到一个达梦数据库凭证,我的Navicat貌似没有连接达梦数据库的选项,也没有通过 jdbc 连接的选项。所以使用一个叫SQLark的工具,跟Navicat很像。
进了一个数据库,执行select * from v$version;
发现是达梦数据库V8,国产数据库了解不多。用户是SYSDBA
某个库里面表太多了,三百多个表,表名很多都是USER结尾,但打开都是空的,但是看数据库体积有很大,想统计每个表数据条数然后,看最多的几个。
但是搜了全网,达梦不支持这种视图,找到的一个方法是 新建一个表,然后每个数据塞进去:https://developer.baidu.com/article/details/2858872
这绝对不符合规定的。
所以另辟蹊径
先查当前用户能访问多少表
注意不要用 select * from user_tables;
查询当前用户的表,因为很有可能就俩 ##
开头的表,这俩表属于当前用户,但是不代表当前用户只能看这两个。
我们要查当前用户能访问哪些表:
sql
1SELECT OWNER, TABLE_NAME FROM ALL_TABLES;
然后筛选一下库,因为SYS库里太多无用的表。
sql
1SELECT OWNER, TABLE_NAME FROM ALL_TABLES where OWNER='库名';
然后一个个表查,不过要批量查
将所有表名构造成如下格式(下面代码块只是格式示例。不是具体执行语句):
sql
1SELECT 'SYSOBJECTS' AS table_name, COUNT(*) AS row_count FROM SYSOBJECTS
2UNION ALL
3SELECT 'SYSINDEXES' AS table_name, COUNT(*) AS row_count FROM SYSINDEXES
4UNION ALL
5SELECT 'SYSCOLUMNS' AS table_name, COUNT(*) AS row_count FROM SYSCOLUMNS;
我建议用表格工具构造,类似:
左边语句 | 表名 | 中间语句 | 表名 |
---|---|---|---|
SELECT ' | SYSOBJECTS | ’ AS table_name, COUNT(*) AS row_count FROM | SYSOBJECTS |
SELECT ' | SYSINDEXES | ’ AS table_name, COUNT(*) AS row_count FROM | SYSINDEXES |
SELECT ' | SYSCOLUMNS | ’ AS table_name, COUNT(*) AS row_count FROM | SYSCOLUMNS |
然后复制到文本编辑器,把制表符删去,开启正则替换:换行符 \n
替换为 \nUNION ALL\n
,这样就能在每行里面加入联合查询的语句。把最后一行的UNION ALL
删掉,补个;
即可构成语句。
然后打开对应库的查询窗口执行语句(不要打开错视图了,查SYS就打开SYS库的查询窗口,查其他库就打开相应查询窗口,错了会显示无效的表或视图名),就能获得所有表的数据条数。
然后终于在三百多个表中找到了存储大量用户数据的表,例图: