CREATE RULE

Nome

CREATE RULE -- cria uma regra de reescrita

Sinopse

CREATE [ OR REPLACE ] RULE nome AS ON evento
    TO tabela [ WHERE condição ]
    DO [ ALSO | INSTEAD ] { NOTHING | comando | ( comando ; comando ... ) }

Descrição

O comando CREATE RULE cria uma regra a ser aplicada à tabela ou visão especificada. O comando CREATE OR REPLACE RULE cria uma regra, ou substitui uma regra existente com o mesmo nome para a mesma tabela.

O sistema de regras do PostgreSQL permite definir uma ação alternativa a ser realizada nas inserções, atualizações ou exclusões em tabelas do banco de dados. Grosso modo, uma regra faz com que sejam executados comandos adicionais quando é executado um determinado comando em uma determinada tabela. Como alternativa, a regra INSTEAD pode substituir um determinado comando por outro, ou até mesmo fazer com que o comando não seja executado. [1] [2] [3] As regras também são utilizadas para implementar as visões das tabelas. É importante perceber que a regra é, na realidade, um mecanismo de transformação de comando, ou uma macro de comando. A transformação acontece antes do início da execução do comando. Se, na verdade, for desejada uma operação que dispare de forma independente para cada linha física, provavelmente o que se deseja é um gatilho, e não uma regra. Podem ser obtidas mais informações sobre o sistema de regras no Capítulo 33.

Atualmente as regras ON SELECT devem ser regras INSTEAD incondicionais, e devem possuir ações consistindo de um único comando SELECT. Portanto, uma regra ON SELECT na verdade transforma a tabela em uma visão, cujo conteúdo visível são as linhas retornadas pelo comando SELECT da regra, em vez do que está armazenado na tabela (se houver alguma coisa). É considerado um estilo melhor usar o comando CREATE VIEW, em vez de criar uma tabela real e definir uma regra ON SELECT para a mesma.

É possível criar a ilusão de uma visão atualizável definindo regras ON INSERT, ON UPDATE e ON DELETE, ou qualquer subconjunto destas que seja suficiente para as finalidades desejadas, para substituir as ações de atualização na visão por atualizações apropriadas em outras tabelas.

Existe algo a ser lembrado quando se tenta utilizar regras condicionais para atualização de visões: é obrigatório haver uma regra incondicional INSTEAD para cada ação que se deseja permitir na visão. Se a regra for condicional, ou não for INSTEAD, então o sistema continuará a rejeitar as tentativas de realizar a ação de atualização, porque acha que poderá acabar tentando realizar a ação sobre a tabela fictícia da visão em alguns casos. Caso se deseje tratar todos os casos úteis por meio de regras condicionais, deverá ser adicionada uma regra incondicional DO INSTEAD NOTHING para garantir que o sistema sabe que nunca será chamado para atualizar a tabela fictícia. Depois torne as regras condicionais não-INSTEAD; nos casos onde se aplicam, serão adicionadas à ação padrão INSTEAD NOTHING.

Parâmetros

nome

O nome da regra a ser criada, devendo ser distinto do nome de qualquer outra regra para a mesma tabela. Caso existam várias regras para a mesma tabela e mesmo tipo de evento, estas regras serão aplicadas na ordem alfabética dos nomes.

evento

Evento é um entre SELECT, INSERT, UPDATE e DELETE.

tabela

O nome (opcionalmente qualificado pelo esquema) da tabela ou da visão à qual a regra se aplica.

condição

Qualquer expressão condicional SQL (retornando boolean). A expressão condicional não pode fazer referência a nenhuma tabela, exceto NEW e OLD, e não pode conter funções de agregação.

INSTEAD

INSTEAD indica que os comandos devem ser executados no lugar do (instead of) comando original.

ALSO

ALSO indica que os comandos devem ser executados em adição ao comando original.

Se não for especificado nem ALSO nem INSTEAD, o padrão é ALSO.

comando

O comando ou comandos que compõem a ação da regra. Os comandos válidos são SELECT, INSERT, UPDATE, DELETE e NOTIFY.

Dentro da condição e do comando podem ser utilizados os nomes especiais de tabela NEW e OLD, para fazer referência aos valores na tabela referenciada. O NEW é válido nas regras ON INSERT e ON UPDATE, para fazer referência à nova linha sendo inserida ou atualizada. O OLD é válido nas regras ON UPDATE e ON DELETE, para fazer referência à linha existente sendo atualizada ou excluída.

Observações

É necessário possuir o privilégio RULE na tabela para poder definir uma regra para a mesma.

É muito importante tomar cuidado para evitar regras circulares. Por exemplo, embora as duas definições de regra abaixo sejam aceitas pelo PostgreSQL, o comando SELECT faz com que o PostgreSQL relate um erro, por causa da expansão recursiva da regra:

CREATE RULE "_RETURN" AS
    ON SELECT TO t1
    DO INSTEAD
        SELECT * FROM t2;

CREATE RULE "_RETURN" AS
    ON SELECT TO t2
    DO INSTEAD
        SELECT * FROM t1;

SELECT * FROM t1;

Atualmente se a ação da regra contiver um comando NOTIFY, este comando NOTIFY será executado incondicionalmente, ou seja, o NOTIFY será emitido mesmo não havendo nenhuma linha onde a regra se aplique. Por exemplo, em

CREATE RULE me_notifique AS ON UPDATE TO minha_tabela DO ALSO NOTIFY minha_tabela;

UPDATE minha_tabela SET nome = 'foo' WHERE id = 42;

será enviado um evento NOTIFY durante o UPDATE, haja ou não alguma linha que corresponda à condição id = 42. Esta é uma restrição da implementação que deverá estar corrigida em versões futuras.

Compatibilidade

O comando CREATE RULE é uma extensão do PostgreSQL à linguagem, assim como todo o sistema de reescrita de comandos.

Notas

[1]

Oracle — Os gatilhos INSTEAD OF fornecem uma forma transparente para modificar visões que não poderiam ser modificadas diretamente através de comandos da DML (INSERT, UPDATE e DELETE). Estes gatilhos são chamados de gatilhos INSTEAD OF porque, diferentemente dos outros tipos de gatilho, o Oracle dispara o gatilho em vez de executar o comando que disparou o gatilho. Podem ser escritos comandos INSERT, UPDATE e DELETE normais para a visão, e o gatilho INSTEAD OF será disparado para atualizar as tabelas subjacentes de forma apropriada. Os gatilhos INSTEAD OF são ativados para cada linha sendo modificada na visão. Oracle® Database Concepts 10g Release 1 (10.1) Part Number B10743-01 (N. do T.)

[2]

SQL Server — A principal vantagem dos gatilhos INSTEAD OF é permitir a visões que não seriam atualizáveis suportarem atualizações. Uma visão baseada em várias tabelas deve utilizar um gatilho INSTEAD OF para suportar inserções, atualizações e exclusões que fazem referência a dados em mais de uma tabela. Outra vantagem dos gatilhos INSTEAD OF é possibilitar codificar uma lógica que pode rejeitar parte do lote de operações enquanto permite que outra parte das operações seja realizada. Um gatilho INSTEAD OF pode tomar ações como: Ignorar parte das operações; Não processar uma parte das operações e registrar as linhas com problema; Tomar uma ação alternativa se acontecer uma condição de erro. SQL Server 2005 Books Online — Designing INSTEAD OF Triggers (N. do T.)

[3]

DB2 — Os gatilhos INSTEAD OF descrevem como realizar operações de inserção, atualização e exclusão em visões que são complexas demais para suportarem estas operações de forma nativa. Os gatilhos INSTEAD OF permitem os aplicativos utilizarem uma visão como a única interface para todas as operações SQL (inserção, exclusão, atualização e seleção). Geralmente os gatilhos INSTEAD OF contêm o inverso da lógica aplicada no corpo da visão. Por exemplo, considerando uma visão que descriptografa colunas da tabela fonte, o gatilho INSTEAD OF para esta visão criptografaria os dados antes de inseri-los na tabela fonte realizando, portanto, a operação simétrica. Quando se utiliza um gatilho INSTEAD OF a operação de modificação na visão requisitada é substituída pela lógica do gatilho, que realiza a operação em nome da visão. Do ponto de vista do aplicativo tudo isto ocorre de forma transparente, um vez que para o aplicativo todas as operações são realizadas na visão. Somente é permitido um gatilho INSTEAD OF para cada tipo de operação em uma determinada visão. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

SourceForge.net Logo CSS válido!