Postgres utiliza un poderoso sistema de reglas para la especificación de vistas y actualizaciones de vistas ambiguas. Originalmente el sistema de reglas de Postgres consistía en dos implementaciones:
El primero trabajaba utilizando el procesado a nivel de tupla y se implementaba en el ejecutor. El sistema de reglas se disparaba cada vez que se accedía una tupla individual. Esta implementación se retiró en 1.995 cuando la última versión oficial del proyecto Postgres se transformó en Postgres95.
La segunda implementación del sistema de reglas es una técnica llamada reescritura de la consulta. El sistema de reescritura es un módulo que existe entre la etapa del traductor y el planificador/optimizador. Está técnica continúa implementada.
Para información sobre la sintaxis y la creación de reglas en sistema Postgres Diríjase a la Guía del Usuario de PostgreSQL.
El sistema de reescritura de la consulta es un módulo entre la etapa de traducción y el planificador/optimizador. Procesa el árbol devuelto por la etapa de traducción (que representa una consulta de usuario) y si existe una regla que deba ser aplicada a la consulta reescribe el árbol de una forma alternativa.
Ahora esbozaremos el algoritmo del sistema de reescritura de consultas. Para una mejor ilustración, mostraremos como implementar vistas utilizando reglas como ejemplo.
Tengamos la siguiente regla:
create rule view_rule as on select to test_view do instead select s.sname, p.pname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno;
Esta regla se disparará cada vez que se detecte una SELECT contra la relación test_view. En lugar de seleccionar las tuplas de test_view, se ejecutará la instrucción SELECT dada en la parte de la acción de la regla.
Tengamos la siguiente consulta de usuario contra test_view:
select sname from test_view where sname <> 'Smith';
Tenemos aquí una lista de los pasos realizados por el sistema de reescritura de la consulta cada vez que aparece una consulta de usuario contra test_view. (El siguiente listado es una descripción muy informal del algoritmo únicamente para una comprensión básica. Para una descripción detallada diríjase a Stonebraker et al, 1989).
Reescritura de test_view
Toma la consulta dada por la parte de acción de la regla.
Adapta la lista-objetivo para recoger el número y orden de los atributos dados en la consulta del usuario.
Añade la cualificación dada en la cláusula WHERE de la consulta del usuario a la cualificación de la consulta dada en la parte de la acción de la regla.
Dada la definición de la regla anterior, la consulta del usuario será reescrita a la siguiente forma (Nótese que la reescritura se hace en la representación interna de la consulta del usuario devuelta por la etapa de traducción, pero la nueva estructura de datos representará la siguiente consulta):
select s.sname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno and s.sname <> 'Smith';