CREATE RULE name AS ON event TO object [ WHERE condition ] DO [ INSTEAD ] [ action | NOTHING ] |
El nombre de la regla a crear.
Evente puede ser select, update, delete o insert.
Object puede ser table o table.column.
Cualquiera clausula SQL WHERE. new o current pueden aparecer en lugar de una variable de instancia*** siempre que una variable de instancia es admisible en SQL.
Cualquiera clausula SQL. new o current pueden aparecer en lugar de una variable de instancia*** siempre que una variable de instancia sea admisible en SQL.
El Postgres rule systempermite que una action alternativa sea realizada en updates, inserts o deletes en tablas o clases. Actualmente se utilizan reglas para implementar vistas de tablas.
El significado de una regla es que cuando una instancia individual es accedida, actualizada, insertada o borrada, existe una instancia actual (para consultas, actualizaciones y borrados) y una nueva instancia (para actualizaciones y añadidos). Si el event especificado en la clausula ON y la condition especificada en la clausula WHERE son verdaderas para la instancia actual la parte action de la regla es ejecutada. Antes, sin embargo, los valores de los campos de la instancia actual y/o la nueva instancia son sustituidos por current.attribute-name y new.attribute-name.
La parte action de la regla se ejecuta con el mismo identificador de comando y transacción que el comando de usuario que causó la activación.
Es pertinente la precaución con reglas de SQL. Si el mismo nombre de clase o variable de instancia aparece en el event, la condition y la parte action de la regla, son considerados todos diferentes tuplas. De forma más precisa, new y current son las únicas tuplas que son compartidas entre cláusulas. Por ejemplo, las siguientes dos reglas tienen la misma semántica.
ON UPDATE TO emp.salary WHERE emp.name = "Joe" DO UPDATE emp ( ... ) WHERE ... |
ON UPDATE TO emp-1.salary WHERE emp-2.name = "Joe" DO UPDATE emp-3 ( ... ) WHERE ... |
Cuando se elige entre los sistemas de reescritura y reglas de instancia para una aplicación particular de una regla, recuerdese que en el sistema de reescritura, current se refiere a la relación y algunos cualificadores mientras que en el sistema de instancias se refiere a una instancia (tupla).
Es muy importante notar que el sistema de reescritura nunca detectará ni procesará reglas circulares. Por ejemplo, aunque cada una de las siguientes dos reglas con aceptadas por Postgres, el comando de recogida causará la caída de Postgres :
Ejemplo 1. Ejemplo de combinación circular de regals.
CREATE RULE bad_rule_combination_1 AS ON SELECT TO emp DO INSTEAD SELECT TO toyemp; |
CREATE RULE bad_rule_combination_2 AS ON SELECT TO toyemp DO INSTEAD SELECT TO emp; |
Este intento de obtención de datos desde EMP provocará la caída de Postgres.
SELECT * FROM emp; |
Es necesario tener permiso de definición de reglas en una clase para poder definir una regla en el. Se debe utilizar el comando GRANT y REVOKE para modificar estos permisos.
El objeto en una regla SQL no puede ser unna referencia a un array y no puede tener parámetros.
Aparte del campo "oid", los atributos del sistema no pueden ser referenciados en ningún lugar en una regla. Entre otras cosas esto significa que las funciones de instancias (por ejemplo ,foo(emp) donde emp es una clase) no pueden ser llamadas en ningún lugar dentro de una regla.
El sistema almacena el texto de la regla y los planes de consulta como atributos de texto. Esto implica que la creación de reglas puede fallar si la regla más sus varias internas representaciones exceden algún valor que es del orden de una página.
Hacer que Sam obtenga el mismo ajuste de salario que Joe:
CREATE RULE example_1 AS ON UPDATE emp.salary WHERE current.name = "Joe" DO UPDATE emp (salary = new.salary) WHERE emp.name = "Sam"; |
Hacer que Bill obtenga el salario de Joe cuando es accedido:
CREATE RULE example_2 AS ON SELECT TO EMP.salary WHERE current.name = "Bill" DO INSTEAD SELECT (emp.salary) from emp WHERE emp.name = "Joe"; |
Denegar a Joe el acceso al salario de empleados en el departamento de calzado (current_user devuelve el nombre del usuario actual):
CREATE RULE example_3 AS ON SELECT TO emp.salary WHERE current.dept = "shoe" AND current_user = "Joe" DO INSTEAD NOTHING; |
Crear una vista de empleados trabajando en el departamente de juguetes.
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"; |
Todos los nuevos empleados deben hacer 5.000 o menos.
CREATE RULE example_5 AS ON INERT TO emp WHERE new.salary > 5000 DO UPDATE NEWSET salary = 5000; |