客户要求对整个数据库进行搜索,找出敏感字。在网上搜索很久都没有好的解决办法,只好自己写存储过程来处理了。
边学边写可能还有地方不完善的。
--记录查找结果
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();