CREATE RULE

Nombre

CREATE RULE  --  Define una nueva regla

Synopsis

CREATE RULE name AS ON event
    TO object [ WHERE condition ]
    DO [ INSTEAD ] [ action | NOTHING ]
  

Inputs

name

El nombre de la regla a crear.

event

Evente puede ser select, update, delete o insert.

object

Object puede ser table o table.column.

condition

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.

action

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.

Salidas

CREATE

Mensage devulte si la regla es creada con �xito.

Description

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.

Notas

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 ...
    
Cada regla puede tener el tag opcional INSTEAD. Sin este tag, la action sera realizada en adici�n al comando de usuario cuando el event en la parte condition de la regla aparezcan. Alternativamente, la parte action ser� realizada en lugar del comando del usuario. En este �ltimo caso la instead of the user command. In this later case, the action puede ser la palabra clave NOTHING.

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.

Uso

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";
   
Al mismo tiempo que Joe recive un ajuste de salario, el evento ser� verdadero y la instancia actual de Joe y la nueva instancia propuesta est�n disponibles para las rutinas de ejecuci�n. Por lo tanto, este nuevo salario es sustituido en la parte de acci�n de la regla que es subsiguientemente ejecutada. Esto propaga el salario de Joe a 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;
   

Compatibility

SQL92

El comando CREATE RULE es una extensi�n de Postgres No existe la sentencia CREATE RULE en SQL92.