客户要求对整个数据库进行搜索,找出敏感字。在网上搜索很久都没有好的解决办法,只好自己写存储过程来处理了。
边学边写可能还有地方不完善的。
--记录查找结果 delete table CHECK_RESULT; create table CHECK_RESULT ( check_result_id INTEGER, system_name VARCHAR(40), table_name VARCHAR(40), pk_name VARCHAR(40), pk_value VARCHAR(40), column_name VARCHAR(40), column_value VARCHAR(4000), keyword VARCHAR(100) ); --要查找的关键字 delete table CHECK_WORD create table CHECK_WORD ( word_id INTEGER, word_type VARCHAR(40), word_value VARCHAR(100) ); DROP PROCEDURE Sensitive_key; CREATE PROCEDURE Sensitive_key() LANGUAGE SQL BEGIN DECLARE SQL VARCHAR(5000); FOR TN AS C1 CURSOR FOR select table_name from SYSIBM.TABLES WHERE TABLE_SCHEMA='模式名' AND TABLE_TYPE='BASE TABLE'--找出所有表名 DO BEGIN FOR COL AS C2 CURSOR FOR SELECT NAME,(SELECT NAME FROM SYSIBM.SYSCOLUMNS where TBNAME=TN.TABLE_NAME AND KEYSEQ=1)ID FROM SYSIBM.SYSCOLUMNS where TBNAME=TN.TABLE_NAME--找出所有列名,以及主键列。由于库里只有主键有序列,所以用这个条件选择主键。 DO BEGIN FOR K AS C3 CURSOR FOR SELECT WORD_VALUE FROM CHECK_WORD --记录了要关键字的表 DO BEGIN SET SQL='INSERT INTO CHECK_RESULT(CHECK_RESULT_ID,TABLE_NAME,KEYWORD,column_name,COLUMN_VALUE) SELECT '|| COL.ID ||','''|| TN.TABLE_NAME ||''','''|| K.WORD_VALUE ||''','''|| CHAR(COL.NAME) ||''',CHAR('|| COL.NAME ||') FROM '|| TN.TABLE_NAME || ' WHERE CHAR('|| COL.NAME ||')LIKE ''%'|| K.WORD_VALUE ||'%'''||''; IF SQL <> '' THEN PREPARE st FROM SQL; EXECUTE st; end if; END; END FOR; END; END FOR; END; END FOR; END; CALL CMBBCD.Sensitive_key();