[sapl-dev] Integridade referencial do Banco de Dados do SAPL

Luciano De Fazio lucianodefazio em gmail.com
Terça Setembro 25 20:36:22 BRT 2012


Não é tão simples assim.

É preciso também alterar as tabelas, adicionando restrições de integridade
(constraints) às chaves estrangeiras, bem como adicionando chaves
estrangeiras nas tabelas, quando estas (chaves) não existirem, e
eventualmente índices (quando a chave estrangeira não for o primeiro campo
de nenhuma chave primária).

Por exemplo, para não permitir a exclusão de um tipo de matéria legislativa
que contenha registros relacionados, seria necessário adicionar a chave
abaixo na tabela tipo_materia_legislativa:

FOREIGN KEY (tip_materia) REFERENCES materia_legislativa(tip_id_basica) ON
DELETE RESTRICT

Esse é apenas um exemplo da infinidade de relacionamentos na base de dados
do SAPL, e essa restrição (RESTRICT) não pode ser utilizada como estratégia
padrão, pois não atenderia às rotinas do processo legislativo.

Luciano De Fázio

Em 25 de setembro de 2012 19:26, Fabiano Weimar dos Santos <
xirumacanudo em gmail.com> escreveu:

> Luciano,
>
> dá para adicionar validação de integridade relacional sem alterar a
> estrutura das tabelas.
>
> Quanto ao tipo das tabelas, um alter table resolve.
>
> ALTER TABLE nome_da_tabela ENGINE = InnoDB;
>
> A versao que isso passaria a valer é algo que combinamos, obviamente.
>
> -- Fabiano Weimar
>
> Em 25 de setembro de 2012 17:03, Luciano De Fazio
> <lucianodefazio em gmail.com> escreveu:
> > Concordo tb, mas lembro novamente que tabelas MyISAM nao tem suporte a
> > integridade.
> > Alguem vai ter de refazer as tabelas  como InnoDB e criar um script de
> > conversao.
> > Como nao se mexe no banco dentro da versao estavel, isso tera que ficar
> pra
> > proxima.
> > Por enquanto, validar por aplicacao eh a unica alternativa viavel.
> > Luciano De Fazio
> >
> > Em 25/09/2012 16:34, "Gustavo Lepri" <gustavolepri em gmail.com> escreveu:
> >
> >> Fabiano,
> >>
> >> Eu também concordo com você sobre a integradidade ser toda feita no
> banco
> >> e não na aplicação.
> >>
> >> +1 para essa alteração!
> >>
> >> Gustavo Lepri
> >>
> >> Em 25 de setembro de 2012 14:27, Angelo Marcondes de Oliveira Neto
> >> <angelomarcondes em gmail.com> escreveu:
> >>>
> >>> Fabiano,
> >>>
> >>> Bem, vou estudar alternativa ao relacionamento no BD e ver se consigo
> >>> apresentar algo também.
> >>>
> >>> Abraços
> >>>
> >>> UaiGeek - Angelo Marcondes de Oliveira Neto.
> >>> #votoemmongaba
> >>> Blog do UaiGeek
> >>> Carneirinho - MG
> >>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >>> - - - - - - -
> >>> P: Por que esta mensagem é tão curta?
> >>> R: http://3frases.efetividade.net
> >>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >>> - - - - - - -
> >>>
> >>>
> >>>
> >>> Em 25 de setembro de 2012 14:09, Fabiano Weimar dos Santos
> >>> <xirumacanudo em gmail.com> escreveu:
> >>>
> >>>> Oi Pessoal,
> >>>>
> >>>> nada contra seu código Angelo, mas eu acredito que tentar garantir a
> >>>> integridade relacional usando código na camada de aplicacao é errado.
> >>>> Integridade relacional é uma tarefa da camada de banco de dados.
> >>>>
> >>>> A resposta a sua questão é: todos concordam comigo?
> >>>>
> >>>> Eu acho essa estratégia de "flag" para registro excluido errada
> >>>> também. Se isso é importante, ou seja, o ato de excluir manter uma
> >>>> copia dos dados apagados para posterior inspeção manual, pq então não
> >>>> fazemos isso utilizando a estratégia de banco de dados versionado que
> >>>> adotei no spdo. Infelizmente o codigo que utilizei la nao serviria
> >>>> para o sapl, mas a ideia me parece fazer mais sentido.
> >>>>
> >>>> Se houver interesse em atacar essa questao, primeiro define-se a
> >>>> abordagem (se vamos fazer isso usando código no zope ou usando
> >>>> constraints no banco de dados) e depois debates os detalhes técnicos.
> >>>>
> >>>> Minha opniao tecnica pessoal já conhece ;)
> >>>>
> >>>> -- Fabiano Weimar
> >>>>
> >>>> Em 25 de setembro de 2012 12:11, Angelo Marcondes de Oliveira Neto
> >>>> <angelomarcondes em gmail.com> escreveu:
> >>>> > Amigos,
> >>>> >
> >>>> > Estou preocupado com a integridade referencial dos banco de dados do
> >>>> > SAPL e
> >>>> > por isso estou lhes escrevendo, com objetivo de discutirmos qual a
> >>>> > melhor
> >>>> > maneira de evitar que existam quebras de referências, seguindo a
> linha
> >>>> > de
> >>>> > uma discussão iniciada pelo Xiru e pelo Damiatti, anteriormente.
> >>>> > Abaixo, segue uma proposta de código para verificar a integridade,
> >>>> > antes da
> >>>> > exclusão do parlamentar, ou seja do formulário
> >>>> > parlamentar_excluir_proc.dtml.
> >>>> > Gostaria da analise de todos, e saber se esta é a melhor opção no
> >>>> > momento e
> >>>> > se posso trabalhar neste sentido.
> >>>> >
> >>>> >
> >>>> > <dtml-comment>
> >>>> > *****************************************************************
> >>>> > *   Função: Esse método apenas chama o Método SQL de exclusão do*
> >>>> > *       parlamentar, isto é, o método que atribui a verdadeiro o*
> >>>> > *       campo ind_excluido do parlamentar cujo o cod_parlamentar*
> >>>> > *       é recebido.                                             *
> >>>> > *   Argumentos: cod_parlamentar : int - o código do parlamentar *
> >>>> > *       a ser escluído.                                         *
> >>>> > *   Retorno: Atribuição do flag ind_excluido do parlamentar e   *
> >>>> > *       redirecionamento para a página de parlamentares.        *
> >>>> > *   Michael S. Onishi / Daniel C. Azevedo em 01-03-2001.        *
> >>>> > *****************************************************************
> >>>> > * UPDATE                                                        *
> >>>> > *    Ao se excluir um parlamentar, alteramos o índice da tabela *
> >>>> > *  com o autor correspondente (ind_excluido=1) representado a   *
> >>>> > *  exclusão desse relacionamento, além da exclusão, se houver,  *
> >>>> > *  do username cadastrado no acl_user como login.               *
> >>>> > *  Rogério Ueda em 18-12-2003                                   *
> >>>> > *****************************************************************
> >>>> > </dtml-comment>
> >>>> >
> >>>> > <dtml-if
> >>>> >
> >>>> >
> expr="zsql.composicao_comissao_obter_zsql(cod_parlamentar=cod_parlamentar)">
> >>>> >   <dtml-let mensagem="'Parlamentar está cadastro como membro de
> >>>> > comissão(ões) e não pode ser excluído!'">
> >>>> >      <dtml-var mensagem_emitir>
> >>>> >   </dtml-let>
> >>>> > <dtml-elif
> >>>> >
> >>>> >
> expr="zsql.composicao_mesa_obter_zsql(cod_parlamentar=cod_parlamentar)">
> >>>> >   <dtml-let mensagem="'Parlmentar está cadastrado como membro de
> mesa
> >>>> > diretora e não pode ser excluído'">i
> >>>> >      <dtml-var mensagem_emitir>
> >>>> > </dtml-let>
> >>>> > <dtml-elif
> >>>> >
> >>>> >
> expr="zsql.composicao_mesa_sessao_obter_zsql(cod_parlamentar=cod_parlamentar)">
> >>>> >   <dtml-let mensagem="'Parlmentar está cadastrado como membro de
> mesa
> >>>> > diretora de sessão plenária e não pode ser excluído'">i
> >>>> >      <dtml-var mensagem_emitir>
> >>>> >         </dtml-let>
> >>>> >
> >>>> >
> >>>> > <dtml-else>
> >>>> > <dtml-try>
> >>>> >    <dtml-call
> >>>> >
> expr="zsql.parlamentar_excluir_zsql(cod_parlamentar=cod_parlamentar)">
> >>>> > <dtml-except>
> >>>> >   <dtml-let mensagem="'Houve um erro! Parlamentar não excluído!'">
> >>>> >      <dtml-var mensagem_emitir>
> >>>> >   </dtml-let>
> >>>> >   <dtml-call expr="REQUEST.set('erro', 1)">
> >>>> > </dtml-try>
> >>>> >
> >>>> > <dtml-unless erro>
> >>>> >   <dtml-try>
> >>>> >      <dtml-in
> >>>> > expr="zsql.autor_obter_zsql(cod_parlamentar=cod_parlamentar)">
> >>>> >         <dtml-call expr="zsql.autor_excluir_zsql(cod_autor)">
> >>>> >         <dtml-call
> >>>> > expr="pysc.username_excluir_pysc(username=col_username)">
> >>>> >      </dtml-in>
> >>>> >   <dtml-except>
> >>>> >      <dtml-let mensagem="'Parlamentar Excluído com Sucesso!<BR>Houve
> >>>> > um
> >>>> > erro! Autor Não Excluído!'">
> >>>> >         <dtml-var mensagem_emitir>
> >>>> >      </dtml-let>
> >>>> >   <dtml-else>
> >>>> >      <dtml-let mensagem="'Parlamentar Excluído com Sucesso!'"
> >>>> > sucesso="1">
> >>>> >         <dtml-var mensagem_emitir>
> >>>> >      </dtml-let>
> >>>> >   </dtml-try>
> >>>> >
> >>>> > </dtml-unless>
> >>>> >
> >>>> > </dtml-if>
> >>>> >
> >>>> >
> >>>> >
> >>>> >
> >>>> > UaiGeek - Angelo Marcondes de Oliveira Neto.
> >>>> > #votoemmongaba
> >>>> > Blog do UaiGeek
> >>>> > Carneirinho - MG
> >>>> > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> -
> >>>> > - - -
> >>>> > - - - - - -
> >>>> > P: Por que esta mensagem é tão curta?
> >>>> > R: http://3frases.efetividade.net
> >>>> > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> -
> >>>> > - - -
> >>>> > - - - - - -
> >>>> >
> >>>> >
> >>>> > --
> >>>> > Wiki do SAPL:
> >>>> > http://colab.interlegis.gov.br/wiki/ProjetoSapl
> >>>> >
> >>>> > Regras de participação:
> >>>> > http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
> >>>> >
> >>>> > Para administrar sua conta visite:
> >>>> > http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> Interessado em meus Cursos e Palestras? Inscreva-se em:
> >>>> https://groups.google.com/d/forum/cursos-do-xiru?hl=pt-BR
> >>>>
> >>>> Fabiano Weimar dos Santos @xiru
> >>>> http://blog.xiru.org
> >>>> http://www.pytown.com
> >>>> --
> >>>> Wiki do SAPL:
> >>>> http://colab.interlegis.gov.br/wiki/ProjetoSapl
> >>>>
> >>>> Regras de participação:
> >>>> http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
> >>>>
> >>>> Para administrar sua conta visite:
> >>>> http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
> >>>
> >>>
> >>>
> >>> --
> >>> Wiki do SAPL:
> >>> http://colab.interlegis.gov.br/wiki/ProjetoSapl
> >>>
> >>> Regras de participação:
> >>> http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
> >>>
> >>> Para administrar sua conta visite:
> >>> http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
> >>
> >>
> >>
> >>
> >> --
> >> Gustavo Lepri
> >>
> >> --
> >> Wiki do SAPL:
> >> http://colab.interlegis.gov.br/wiki/ProjetoSapl
> >>
> >> Regras de participação:
> >> http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
> >>
> >> Para administrar sua conta visite:
> >> http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
> >
> >
> > --
> > Wiki do SAPL:
> > http://colab.interlegis.gov.br/wiki/ProjetoSapl
> >
> > Regras de participação:
> > http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
> >
> > Para administrar sua conta visite:
> > http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
>
>
>
> --
> Interessado em meus Cursos e Palestras? Inscreva-se em:
> https://groups.google.com/d/forum/cursos-do-xiru?hl=pt-BR
>
> Fabiano Weimar dos Santos @xiru
> http://blog.xiru.org
> http://www.pytown.com
> --
> Wiki do SAPL:
> http://colab.interlegis.gov.br/wiki/ProjetoSapl
>
> Regras de participação:
> http://colab.interlegis.gov.br/wiki/ComoParticiparComunidade
>
> Para administrar sua conta visite:
> http://listas.interlegis.gov.br/mailman/listinfo/sapl-dev
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.interlegis.gov.br/pipermail/sapl-dev/attachments/20120925/b2a706ba/attachment.htm 


Mais detalhes sobre a lista de discussão SAPL-dev