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

数据库系统

开发平台:

Unix_Linux

  1. ." This is -*-nroff-*-
  2. ." XXX standard disclaimer belongs here....
  3. ." $Header: /usr/local/cvsroot/pgsql/src/man/Attic/create_rule.l,v 1.11 1999/02/07 22:10:09 wieck Exp $
  4. .TH "CREATE RULE" SQL 11/05/95 PostgreSQL PostgreSQL
  5. .SH NAME
  6. create rule - define a new rule
  7. .SH SYNOPSIS
  8. .nf
  9. fBcreatefR fBrulefR rule_name
  10.     fBasfR fBonfR event
  11.       fBtofR object [fBwherefR clause]
  12.     fBdofR [fBinsteadfR]
  13.     [fBnothingfP | action | fB(fPactions...fB)fP]
  14. .fi
  15. .SH DESCRIPTION
  16. .PP
  17. .BR "Create rule"
  18. is used to define a new rule.
  19. .PP
  20. Here, 
  21. .IR event
  22. is one of 
  23. .IR select ,
  24. .IR update ,
  25. .IR delete
  26. or
  27. .IR insert .
  28. .IR Object
  29. is a class name.
  30. .PP
  31. The 
  32. .BR "where"
  33. clause, and the
  34. .IR action
  35. are respectively normal SQL
  36. .BR "where"
  37. clauses and collections of SQL commands with the following change:
  38. .IP
  39. .BR new
  40. or
  41. .BR old
  42. can appear instead of 
  43. an instance variable whenever an instance 
  44. variable is permissible in SQL.
  45. .PP
  46. Since v6.4 rules on
  47. .IR select
  48. are restricted to build
  49. .BR views .
  50. .BR "Create view"
  51. should be used instead.
  52. .PP
  53. The semantics of a rule is that at the time an individual instance is
  54. updated, inserted or deleted, there is an
  55. .BR old
  56. instance
  57. (for updates and deletes) and a 
  58. .BR new
  59. instance (for updates and inserts).  If the event specified in the
  60. .BR "on"
  61. clause and the condition specified in the
  62. .BR "where"
  63. clause are true, then the 
  64. .IR action
  65. part of the rule is executed.  First, however, values from fields in
  66. the old instance and/or the new instance are substituted for:
  67. .nf
  68. old.attribute-name
  69. new.attribute-name
  70. .fi
  71. The
  72. .IR action
  73. part of the rule executes with same transaction identifier
  74. before the user command that caused activation. 
  75. .PP
  76. Each rule can have the optional tag 
  77. .BR "instead" .
  78. Without this tag 
  79. .IR action
  80. will be performed in addition to the user command when the event in
  81. the condition part of the rule occurs.  Alternately, the
  82. .IR action 
  83. part will be done instead of the user command.
  84. In this later case, the action can be the keyword
  85. .BR nothing .
  86. .PP
  87. It is very important to note that the 
  88. .BR rewrite 
  89. rule system will 
  90. neither detect nor process circular
  91. rules. For example, though each of the following two rule
  92. definitions are accepted by Postgres, the  
  93. .IR update 
  94. command to one of the classes will cause 
  95. Postgres to abort the transaction during the attempt to apply rules.
  96. .nf
  97. --
  98. --Example of a circular rewrite rule combination. 
  99. --
  100. create rule bad_rule_combination_1 as
  101. on update to EMP 
  102. do update TOY set ...;
  103. create rule bad_rule_combination_2 as
  104. on update to TOY
  105. do update EMP set ...;
  106. .fi
  107. .PP
  108. You must have
  109. .IR "rule definition"
  110. access to a class in order to define a rule on it.
  111. .PP
  112. In contrast to queries run by trigger procedures,
  113. the rule actions are executed under the permissions of the owner
  114. of the 
  115. .BR event
  116. class. Thus, if the owner of a class defines a rule that inserts something
  117. into another one (like in the log example below), the user updating the
  118. .BR event
  119. class must not have
  120. .IR insert
  121. permissions for the class specified in the
  122. .BR "rule actions" .
  123. This technique can safely be used to deny users from modifying event logging.
  124. .SH EXAMPLES
  125. .nf
  126. --
  127. --Make Sam get the same salary adjustment as Joe
  128. --
  129. create rule example_1 as
  130.     on update to EMP where old.name = "Joe"
  131.     do update EMP set salary = new.salary
  132.         where EMP.name = "Sam";
  133. .fi
  134. At the time Joe receives a salary adjustment, the event will become
  135. true and Joe's old instance and proposed new instance are available
  136. to the execution routines.  Hence, his new salary is substituted into the 
  137. .IR action
  138. part of the rule which is executed.  This propagates
  139. Joe's salary on to Sam.
  140. .nf
  141. --
  142. -- Log changes to salary
  143. --
  144. create rule example_2 as
  145.     on insert to EMP
  146.     do insert into EMP_LOG (name, newsal, when)
  147.         values (new.name, new.salary, 'now'::text);
  148. create rule example_3 as
  149.     on update to EMP where old.salary != new.salary
  150.     do insert into EMP_LOG (name, oldsal, newsal, when)
  151.         values (old.name, old.salary, new.salary, 'now'::text);
  152. create rule example_4 as
  153.     on delete to EMP
  154.     do insert into EMP_LOG (name, oldsal, when)
  155.         values (old.name, old.salary, 'now'::text);
  156. .fi
  157. .SH "SEE ALSO"
  158. drop_rule(l),
  159. create_view(l),
  160. create_trigger(l).
  161. .SH BUGS
  162. .PP
  163. The rule system stores the rule definition as query plans into text 
  164. attributes.  This implies that creation of rules may fail if the
  165. rule in its internal representations exceed some value
  166. that is on the order of one page (8KB).