请问在mysql的update trigger中,如何获取当前执行的sql语中的where条件,谢谢

解决方案 »

  1.   

    在trigger中获取到语句要做什么呢
      

  2.   

    如果是5以上,可以查询
    information_schema表中的info字段
    SELECT * FROM information_schema.`PROCESSLIST` P
    where and command='Query'
    and state='executing'
    and info='select ... your sql statement'查后再取内容中WHERE 后面的内容
      

  3.   

    我的这个update trigger更新的是memcache,而我还要从memcache中取出数据,还原到oracle中,所以,要取得mysql执行的sql语句的条件
      

  4.   

    而我还要从memcache中取出数据,还原到oracle中:
    你可以用一个表存放更新前memcache的值
    trigger中:
    insert into lsb values(old.memcache)
      

  5.   

    如果你只是要取更新前memcache的值,在TRIGGER中用old.memcache就OK了,保存到一个表中,再
    导入到ORACLE中
      

  6.   

    memcache中的数据只是增加,所以不用备份,问题在于当要还原到oracle的时候,如何确定当前数据where条件
      

  7.   

    MYSQL 中 比较复杂。你可以通过 SELECT info FROM information_schema.`PROCESSLIST` where id = CONNECTION_ID() 得到当前语句。但分析出WHERE后面的则比较复杂了。
      

  8.   


    这个建议你直接使用BINLOG中的语句,把BINLOG中的UPDATE语句拿出来,然后到ORACLE上执行。
      

  9.   

    binlog中有一些sql语句中用到了mysql的内置函数,但oracle不认
      

  10.   

    写一个程序,定时读取BINLOG中的语句,挑出你需要的。然后需要对 SQL 语句进行分析改写。 这样比你在trigger 中实现可靠得多。毕竟如果用户用了一个比较复杂的 update 语句,比如其中有不止一个 where 你就比较麻烦了。
    另外常用的定时同步,一般是直接在表的记录基础上进行的,很少这样跨平台在语句这一级上实现。
      

  11.   

    比如mysql中 update test set name = 'aaa' where age = 18 and sex = 1更新到memcache中后数据为  {1: 'aaa-18-1'}oracle中如何去更新呢
      

  12.   

    如果只是一些now()之类的函数,程序自动处理没有问题,但有些语句用到了随机函数,程序自动处理就失去了意义,和原来的不一样了,定时同步我不是太懂,能否告之
      

  13.   

    now()函数好像就有问题,呵呵
      

  14.   


    此类函数,你还可以直接放个SQL语句替换表  NOW() -> sysdate但如你所说,随机函数 则没办法了。所以建议用一般的数据倒出,倒入来实现。
    一般是如果表不大,则全表倒出,然后sqldr 
    如果表很大,比如一年以上的数据,则从MYSQL仅导出本日数据 (前提是你的表中记录有这个标志以确定记录的更新时间)
      

  15.   

    mysql> desc triggers;
    +----------------------------+---------------+------+-----+---------+-------+
    | Field                      | Type          | Null | Key | Default | Extra |
    +----------------------------+---------------+------+-----+---------+-------+
    | TRIGGER_CATALOG            | varchar(512)  | YES  |     | NULL    |       |
    | TRIGGER_SCHEMA             | varchar(64)   | NO   |     |         |       |
    | TRIGGER_NAME               | varchar(64)   | NO   |     |         |       |
    | EVENT_MANIPULATION         | varchar(6)    | NO   |     |         |       |
    | EVENT_OBJECT_CATALOG       | varchar(512)  | YES  |     | NULL    |       |
    | EVENT_OBJECT_SCHEMA        | varchar(64)   | NO   |     |         |       |
    | EVENT_OBJECT_TABLE         | varchar(64)   | NO   |     |         |       |
    | ACTION_ORDER               | bigint(4)     | NO   |     | 0       |       |
    | ACTION_CONDITION           | longtext      | YES  |     | NULL    |       |
    | ACTION_STATEMENT           | longtext      | NO   |     | NULL    |       |
    | ACTION_ORIENTATION         | varchar(9)    | NO   |     |         |       |
    | ACTION_TIMING              | varchar(6)    | NO   |     |         |       |
    | ACTION_REFERENCE_OLD_TABLE | varchar(64)   | YES  |     | NULL    |       |
    | ACTION_REFERENCE_NEW_TABLE | varchar(64)   | YES  |     | NULL    |       |
    | ACTION_REFERENCE_OLD_ROW   | varchar(3)    | NO   |     |         |       |
    | ACTION_REFERENCE_NEW_ROW   | varchar(3)    | NO   |     |         |       |
    | CREATED                    | datetime      | YES  |     | NULL    |       |
    | SQL_MODE                   | varchar(8192) | NO   |     |         |       |
    | DEFINER                    | varchar(77)   | NO   |     |         |       |
    | CHARACTER_SET_CLIENT       | varchar(32)   | NO   |     |         |       |
    | COLLATION_CONNECTION       | varchar(32)   | NO   |     |         |       |
    | DATABASE_COLLATION         | varchar(32)   | NO   |     |         |       |
    +----------------------------+---------------+------+-----+---------+-------+
    22 rows in set (0.02 sec)
      

  16.   

    看你的需求,应该是将mysql上update的数据,同步操作更新到oracle数据库里面去吧?如果真是这样的话,那在mysql的update触发器里面抓取new与old的信息记录日志表,然后oracle根据这个日志表的信息来进行数据更新即可。