.
- class="parameter">column.
+ class="parameter">column. (Currently, only the
+ table form is
+ actually implemented.)
condition
- Any SQL WHERE clause, new or
- old, can appear instead of an instance
- variable whenever an instance variable is permissible in SQL.
+ Any SQL boolean-condition expression. The condition expression may not
+ refer to any tables except new and
+ old.
- action
+ query
- Any SQL statement, new or
- old, can appear instead of an instance
- variable whenever an instance variable is permissible in SQL.
+ The query or queries making up the
+ action
+ can be any SQL SELECT, INSERT,
+ UPDATE, DELETE, or
+ NOTIFY statement.
+
+ Within the condition
+ and action, the special
+ table names new and old may be
+ used to refer to values in the referenced table (the
+ object).
+ new is valid in ON INSERT and ON UPDATE rules
+ to refer to the new row being inserted or updated.
+ old is valid in ON SELECT, ON UPDATE, and ON DELETE
+ rules to refer to the existing row being selected, updated, or deleted.
+
rule system allows one to define an
alternate action to be performed on inserts, updates, or deletions
- from database tables or classes. Currently, rules are used to
- implement table views.
+ from database tables. Rules are used to
+ implement table views as well.
- The semantics of a rule is that at the time an individual instance is
+ The semantics of a rule is that at the time an individual instance (row)
+ is
accessed, inserted, updated, or deleted, there is an old instance (for
selects, updates and deletes) and a new instance (for inserts and
- updates).
- If the event
- specified in the ON clause and the
+ updates). All the rules for the given event type and the given target
+ object (table) are examined, in an unspecified order. If the
condition specified in the
- WHERE clause are true for the old instance, the
+ WHERE clause (if any) is true, the
action part of the rule is
- executed. First, however, values from fields in the old instance
- and/or the new instance are substituted for
+ executed. The action is
+ done instead of the original query if INSTEAD is specified; otherwise
+ it is done before the original query is performed.
+ Within both the condition
+ and action, values from
+ fields in the old instance and/or the new instance are substituted for
old.attribute-name
and new.attribute-name.
+ The action part of the rule
+ can consist of one or more queries. To write multiple queries, surround
+ them with either parentheses or square brackets. Such queries will be
+ performed in the specified order (whereas there are no guarantees about
+ the execution order of multiple rules for an object). The
+ action can also be NOTHING
+ indicating no action. Thus, a DO INSTEAD NOTHING rule suppresses the
+ original query from executing (when its condition is true); a DO NOTHING
+ rule is useless.
+
+
The action part of the rule
executes with the same command and transaction identifier as the user
- 1998-09-11
+ 2001-01-05
Notes
- A caution about SQL rules is in order. If the same class name
- or instance variable appears in the
- event,
- condition and
- action parts of a rule,
- they are all considered different tuple variables. More accurately,
- new and old are the only tuple
- variables that are shared between these clauses. For example, the following
- two rules have the same semantics:
-ON UPDATE TO emp.salary WHERE emp.name = "Joe"
- DO
- UPDATE emp SET ... WHERE ...
-
-
-ON UPDATE TO emp-1.salary WHERE emp-2.name = "Joe"
- DO
- UPDATE emp-3 SET ... WHERE ...
-
+ Presently, ON SELECT rules must be unconditional INSTEAD rules and must
+ have actions that consist of a single SELECT query. Thus, an ON SELECT
+ rule effectively turns the object table into a view, whose visible
+ contents are the rows returned by the rule's SELECT query rather than
+ whatever had been stored in the table (if anything). It is considered
+ better style to write a CREATE VIEW command than to create a table and
+ define an ON SELECT rule for it.
+
- Each rule can have the optional tag INSTEAD.
- Without
- this tag, action will be
- performed in addition to the user command when the
- event in the
- condition part of the rule
- occurs. Alternately, the
- action part will be done
- instead of the user command. In this latter case, the
- action can be the keyword
- NOTHING.
+ You must have rule definition access to a class in order
+ to define a rule on it. Use GRANT
+ and REVOKE to change permissions.
+
- It is very important to note to avoid circular rules.
+ It is very important to take care to avoid circular rules.
For example, though each
of the following two rule definitions are accepted by
-
- You must have rule definition access to a class in order
- to define a rule on it. Use GRANT
- and REVOKE to change permissions.
-
-
- The object in a
SQL rule cannot be an array reference and
- cannot have parameters.
-
-
- Aside from the "oid" field, system attributes cannot be
- referenced anywhere in a rule. Among other things, this
- means that functions of instances (e.g., foo(emp) where
- emp is a class) cannot be called anywhere in a rule.
-
-
- The rule system stores the rule text and query plans as
- text attributes. This implies that creation of rules may
- fail if the rule plus its various internal representations
- exceed some value that is on the order of one page (8KB).
-
-
-
-
- Usage
-
- Make Sam get the same salary adjustment as Joe:
-
-CREATE RULE example_1 AS
- ON UPDATE emp.salary WHERE old.name = "Joe"
- DO
- UPDATE emp
- SET salary = new.salary
- WHERE emp.name = "Sam";
-
-
- At the time Joe receives a salary adjustment, the event
- will become true and Joe's old instance and proposed
- new instance are available to the execution routines.
- Hence, his new salary is substituted into the action part
- of the rule which is subsequently executed. This propagates
- Joe's salary on to Sam.
-
- Make Bill get Joe's salary when it is accessed:
-CREATE RULE example_2 AS
- ON SELECT TO EMP.salary
- WHERE old.name = "Bill"
- DO INSTEAD
- SELECT emp.salary
- FROM emp
- WHERE emp.name = "Joe";
-
-
- Deny Joe access to the salary of employees in the shoe
- department (current_user returns the name of
- the current user):
-CREATE RULE example_3 AS
- ON
- SELECT TO emp.salary
- WHERE old.dept = "shoe" AND current_user = "Joe"
- DO INSTEAD NOTHING;
-
-
- Create a view of the employees working in the toy department:
-CREATE toyemp(name = char16, salary = int4);
-
-CREATE RULE example_4 AS
- ON SELECT TO toyemp
- DO INSTEAD
- SELECT emp.name, emp.salary
- FROM emp
- WHERE emp.dept = "toy";
-
-
- All new employees must make 5,000 or less:
-CREATE RULE example_5 AS
- ON INERT TO emp WHERE new.salary > 5000
- DO
- UPDATE emp SET salary = 5000
- WHERE emp.oid = new.oid;
-
-
-