查询数据库中的敏感数据

来源:这里教程网 时间:2026-03-03 20:57:02 作者:



客户有个需求,查询数据库中所有包含内部、内部资料、秘密、机密、保密、密、等等。。
等字段的表和字段。 创建如下存储过程,查询当前用户(查open状态的生产用户即可sys和system之类的系统用户没有必要, 查询语句 select username,account_status  from dba_users where account_status= 'OPEN';) 下有哪些表,遍历这些表的所有字符类型的列,查出每个列的值对比有没有和我们输入的敏感字段相符的,有的话记录表明和列名到 tmptable_zyr。 1 创建结果存储表 create table tmptable_zyr (tab_name varchar2( 300) , col_name varchar2( 300)); 2 创建存储过程 CREATE OR REPLACE procedure QUERY_KEY ( keyword in varchar2 ) as  v_SQLStatement varchar2( 4000);   v_startRecord Number; begin  FOR reInfo IN ( select table_name from user_tables) LOOP    FOR colInfo IN (SELECT column_name, DATA_TYPE                      FROM user_tab_cols                     WHERE table_name = reInfo.table_name) LOOP      IF (colInfo.DATA_TYPE like   '%CHAR%'  ) THEN            v_SQLStatement := 'select count(*) from ' || reInfo.table_name ||                           ' where ' || colInfo.column_name || ' like ' '%'||                          keyword|| '%' '';         execute immediate v_SQLStatement          into v_startRecord;               IF (v_startRecord > 0) THEN                  insert into tmptable_zyr values (reInfo.table_name,colInfo.column_name);                  commit;                 END IF;             END IF;     END LOOP;   END LOOP; END QUERY_KEY; 3 执行存储过程 call QUERY_KEY( '保密'); 4 查询是否有敏感数据 select * from tmptable_zyr; col TAB_NAME format a30 col COL_NAME format a30 select * from tmptable_zyr; **************************以下是本机测试情况********************************************** 测试样例: 创建测试表 create table ttt (name varchar2( 30)); 插入数据 insert into ttt values( '保密'); commit; 确认数据 select * from ttt; 进行敏感查询 call QUERY_KEY( '保密'); 查询是否查出敏感数据 select * from tmptable_zyr; 1   TTT  NAME 可以看到查出了TTT表的name 列。 有问题可以用下面的调试 加上了         DBMS_OUTPUT.PUT_LINE(v_SQLStatement);                                                     create table tmptable_zyr (tab_name varchar2( 300) , col_name varchar2( 300)); CREATE OR REPLACE procedure QUERY_KEY ( keyword in varchar2 ) as  v_SQLStatement varchar2( 3000);   v_startRecord Number; begin  FOR reInfo IN ( select table_name from user_tables) LOOP    FOR colInfo IN (SELECT column_name, DATA_TYPE                      FROM user_tab_cols                     WHERE table_name = reInfo.table_name) LOOP      IF (colInfo.DATA_TYPE like   '%CHAR%'  ) THEN            v_SQLStatement := 'select count(*) from ' || reInfo.table_name ||                           ' where ' || colInfo.column_name || ' like ' '%'||                          keyword|| '%' '';        DBMS_OUTPUT.PUT_LINE(v_SQLStatement);                                                             execute immediate v_SQLStatement          into v_startRecord;               IF (v_startRecord > 0) THEN                  insert into tmptable_zyr values (reInfo.table_name,colInfo.column_name);                  commit;                 END IF;             END IF;     END LOOP;   END LOOP; END QUERY_KEY;

相关推荐