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; |