无SQL Search权限,如何查找数据库中疑似'system origin'的列?
嘿,这个场景我太熟悉了!没法用SQL Search工具的话,咱们直接利用数据库自带的元数据系统来排查就行,不同数据库的具体操作略有差异,我给你整理了几个主流数据库的方案,按步骤来就能找到目标列:
通用思路
先通过元数据找出所有疑似名称的列(比如包含"system"、"origin"或者带空格的"system origin"),再验证这些列是否存在W、X、Y、Z这些取值。
针对不同数据库的具体操作
MySQL/MariaDB
第一步:找出候选列
先查询所有可能匹配名称的列,连带着所属库和表一起输出:
SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE column_name LIKE '%system%' OR column_name LIKE '%origin%' OR column_name LIKE '%system origin%'; -- 考虑列名带空格的情况
第二步:验证列的取值
如果候选列不多,可以手动逐个查询:
-- 替换成实际的库、表、列名 SELECT DISTINCT `column_name` FROM `your_database`.`your_table` WHERE `column_name` IN ('W', 'X', 'Y', 'Z') LIMIT 1; -- 只要返回结果,就说明这个列符合要求
要是候选列太多,用动态SQL自动遍历更高效:
SET @sql = ''; SELECT GROUP_CONCAT( 'SELECT ''', table_schema, '.', table_name, '.', column_name, ''' AS matched_column FROM ', table_schema, '.', table_name, ' WHERE ', column_name, ' IN (''W'', ''X'', ''Y'', ''Z'') LIMIT 1' SEPARATOR ' UNION ALL ' ) INTO @sql FROM information_schema.columns WHERE column_name LIKE '%system%' OR column_name LIKE '%origin%' OR column_name LIKE '%system origin%'; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SQL Server
第一步:找出候选列
利用系统视图sys.columns和sys.tables来定位:
SELECT SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name, c.name AS column_name FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE c.name LIKE '%system%' OR c.name LIKE '%origin%' OR c.name LIKE '%system%origin%'; -- 适配带空格或下划线的变体
第二步:验证列的取值
手动验证的写法:
-- 替换成实际的架构、表、列名 SELECT DISTINCT column_name FROM your_schema.your_table WHERE column_name IN ('W', 'X', 'Y', 'Z');
动态SQL自动遍历的版本(需要对应权限):
DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'SELECT ''' + SCHEMA_NAME(t.schema_id) + '.' + t.name + '.' + c.name + ''' AS matched_column FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' IN (''W'', ''X'', ''Y'', ''Z'') LIMIT 1 UNION ALL ' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE c.name LIKE '%system%' OR c.name LIKE '%origin%' OR c.name LIKE '%system%origin%'; -- 去掉最后多余的UNION ALL SET @sql = LEFT(@sql, LEN(@sql) - 10); EXEC sp_executesql @sql;
PostgreSQL
第一步:找出候选列
用information_schema.columns查询,PostgreSQL的ILIKE支持大小写不敏感匹配:
SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE column_name ILIKE '%system%' OR column_name ILIKE '%origin%' OR column_name ILIKE '%system origin%';
第二步:验证列的取值
手动查询:
-- 替换成实际的架构、表、列名 SELECT DISTINCT column_name FROM your_schema.your_table WHERE column_name IN ('W', 'X', 'Y', 'Z');
动态SQL自动遍历:
DO $$ DECLARE rec RECORD; sql_stmt TEXT; BEGIN FOR rec IN SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE column_name ILIKE '%system%' OR column_name ILIKE '%origin%' OR column_name ILIKE '%system origin%' LOOP sql_stmt := 'SELECT ''' || rec.table_schema || '.' || rec.table_name || '.' || rec.column_name || ''' AS matched_column FROM ' || quote_ident(rec.table_schema) || '.' || quote_ident(rec.table_name) || ' WHERE ' || quote_ident(rec.column_name) || ' IN (''W'', ''X'', ''Y'', ''Z'') LIMIT 1'; EXECUTE sql_stmt; END LOOP; END $$;
额外提示
- 如果列名的变体很多(比如缩写、下划线替代空格),可以调整
LIKE的匹配规则,比如%sys%origin%、%system_origin%都加上 - 要是数据库权限有限,可能没法访问系统元数据视图,这时候就得找DBA帮忙啦
内容的提问来源于stack exchange,提问作者Shoaib Maroof
相关产品推荐
相关产品推荐

