domingo, 31 de outubro de 2010

BD: ON DELETE com RESTRICT ou NO ACTION ?

Essa é uma pergunta que ouço algumas vezes de alunos ao definir a propagação de exclusão. Vamos entender as implicações.

Ao definir o tipo de integridade referencial entre tabelas de um banco de dados, definimos a propagação de atualizações de uma tabela pai em tabelas filhas tanto para atualização quanto para exclusão de registros. Nesta definição de propagação (que aceita CASCADE, RESTRICT, NO ACTION, SET NULL ou SET DEFAULT, na maioria dos bancos de dados), há uma diferença singela entre o uso de RESTRICT e de NO ACTION, que por muitas vezes leva à certa confusão.

Na propagação de uma atualização (UPDATE) é fácil visualizar a diferença. Ao usar NO ACTION, se um registro na tabela pai se atualizar, as chaves estrangeiras nos registros na tabela filha não serão atualizados (nenhuma ação mesmo, literalmente) e o comando não irá falhar se (e somente se) a integridade referencial se mantiver, ou seja, se a chave estrangeira continuar referenciando um registro existente na tabela pai. Ao usar RESTRICT, simplesmente a mudança de valor é restringida (impedida), fazendo com que a atualização na tabela pai falhe.

Na proparação de uma exclusão (DELETE), ao usar RESTRICT, a exclusão de um registro pai será impedida se houverem registros filhos. Agora, ao usar NO ACTION, será aguardado para ver o que ocorre com a integridade referencial. Se não se mantiver - o que parece sensato, pois se está excluindo o registro pai, fazendo com que os filhos fiquem órfãos - o comando irá falhar. Um possível caso dos registros não ficarem órfãos ocorreria se fosse rodado um TRIGGER que ajustasse a chave estrangeira nos registros filhos para registros existentes na tabela pai. Como esse caso é raro, pois são poucos os casos práticos onde se necessita efetuar este ajuste, a maioria dos DELETEs com NO ACTION irão falhar, fazendo com que seu comportamento (na prática) se assemelhe com o do RESTRICT, visto que ambos irão impedir a exclusão do registro pai.

Portanto, apesar da semelhança prática entre  RESTRICTNO ACTION para propagações de exclusão, é importante saber diferenciá-las para realizar uma escolha acertada. Na maioria dos casos, RESTRICT pode ser a escolha mais adequada. Porém, provavelmente por questões de performance – para não precisar efetuar a checagem dos valores, mas só da integridade, ao final – os bancos de dados vem como a opção NO ACTION como a default.

Nenhum comentário: