问题是这样的:
数据库中有部分存放数据的表填加了一个字段 CLICK_COUNTS, 数值型的, 要求, 当表中的某一记录被用户查询命中, 那么CLICK_COUNTS 加1.已经搞好了一个方案并实现: 用C#写了一个类, 使用时传入 ORACLE 连接, 表名, 查询条件, 程序就会将 CLICK_COUNTS 加1.缺点很明显, 每次查询都要调用, 如果有人用其它程序(如TOAD)连接到数据库上查询, 那么根本无法控制.另一个方案就是, 在数据库端监视. 想过 半夜查询V$SQL视图的方式, 而且已经可以准确的找到其中的 SQL 语句, 但问题是, 1. V$SQL查出来的内容是否完整, 会不会出现丢失?; 2. 时间如何确定? 还有没有更好的方案? 附 查询视图的SQL:
SELECT SUBSTR(SQL_TEXT, (INSTR(UPPER(SQL_TEXT), ' FROM ')+6), INSTR(SUBSTR(SQL_TEXT, (INSTR(UPPER(SQL_TEXT), ' FROM ')+6), 20), ' ')-1) INSTERESTED, 
   SQL_TEXT 
   FROM V$SQL
   WHERE UPPER(SQL_TEXT) LIKE 'SELECT % FROM %' AND UPPER(SQL_TEXT) NOT LIKE '%V%SQL%' 
   AND SUBSTR(SQL_TEXT, (INSTR(UPPER(SQL_TEXT), ' FROM ')+6), INSTR(SUBSTR(SQL_TEXT, (INSTR(UPPER(SQL_TEXT), ' FROM ')+6), 20), ' ')-1) IN 
       (SELECT TNAME FROM COL WHERE CNAME LIKE 'CLICK_COUNTS') 
   AND FETCHES > 0
   ORDER BY LAST_ACTIVE_TIME DESC