timetravel.example
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. drop table tttest;
  2. create table tttest (
  3. price_id int4, 
  4. price_val int4, 
  5. price_on abstime,
  6. price_off abstime
  7. );
  8. create trigger timetravel 
  9. before insert or delete or update on tttest
  10. for each row 
  11. execute procedure 
  12. timetravel (price_on, price_off);
  13. insert into tttest values (1, 1, null, null);
  14. insert into tttest(price_id, price_val) values (2, 2);
  15. insert into tttest(price_id, price_val,price_off) values (3, 3, 'infinity');
  16. insert into tttest(price_id, price_val,price_off) values (3, 3, 
  17. datetime_abstime(datetime_mi_span('now', '100')));
  18. insert into tttest(price_id, price_val,price_on) values (3, 3, 'infinity');
  19. select * from tttest;
  20. delete from tttest where price_id = 2;
  21. select * from tttest;
  22. -- what do we see ?
  23. -- get current prices
  24. select * from tttest where price_off = 'infinity';
  25. -- change price for price_id == 3
  26. update tttest set price_val = 30 where price_id = 3;
  27. select * from tttest;
  28. -- now we want to change price_id from 3 to 5 in ALL tuples
  29. -- but this gets us not what we need
  30. update tttest set price_id = 5 where price_id = 3;
  31. select * from tttest;
  32. -- restore data as before last update:
  33. select set_timetravel('tttest', 0); -- turn TT OFF!
  34. delete from tttest where price_id = 5;
  35. update tttest set price_off = 'infinity' where price_val = 30;
  36. select * from tttest;
  37. -- and try change price_id now!
  38. update tttest set price_id = 5 where price_id = 3;
  39. select * from tttest;
  40. -- isn't it what we need ?
  41. select set_timetravel('tttest', 1); -- turn TT ON!
  42. -- we want to correct some date
  43. update tttest set price_on = 'Jan-01-1990 00:00:01' where price_id = 5 and 
  44. price_off <> 'infinity';
  45. -- but this doesn't work
  46. -- try in this way
  47. select set_timetravel('tttest', 0); -- turn TT OFF!
  48. update tttest set price_on = '01-Jan-1990 00:00:01' where price_id = 5 and 
  49. price_off <> 'infinity';
  50. select * from tttest;
  51. -- isn't it what we need ?
  52. -- get price for price_id == 5 as it was '10-Jan-1990'
  53. select * from tttest where price_id = 5 and 
  54. price_on <= '10-Jan-1990' and price_off > '10-Jan-1990';