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.

sábado, 30 de outubro de 2010

SVN: Mudando o local do repositório na cópia de trabalho

Quando temos um repositório num servidor que não tem um IP fixo, por exemplo, nossa cópia de trabalho (working copy) continua referenciando o último IP utilizado.

Isto faz com que, ao efetuarmos um commit, haja falha no envio dos dados já que, obviamente, o servidor não existe mais naquele endereço (IP).

Para resolver este problema, simplesmente podemos usar o comando:

svn switch --relocate <repositório_antigo> <repositório_novo>

Por exemplo:

svn switch --relocate http://192.168.1.76/projeto/trunk http://192.168.1.41/projeto/trunk

Com o Tortoise SVN, isto pode ser feito através da opção Relocate, que abrirá uma janela onde podemos fornecer o local do repositório.

Restart

Trabalho, pós, mestrado… muitas coisas tiveram sua participação no tempo em que fiquei sem escrever neste blog. Não estou em situação diferente que estava, mas apesar disto, estou disposto a tentar escrever um post aqui e outro acolá, mantendo uma certa regularidade.

Time will tell…

Agradeço aos leitores, seguidores e alunos pelo incentivo, sugestões e dúvidas, já que estas sempre servem de inspiração para novos posts.