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.