É mesmo possível?
Meu caso de uso é uma tabela contábil, com a exigência de que uma vez que um registro seja criado, ele deve ser somente leitura, ou seja, ninguém deve poder editá-lo ou excluí-lo. Isso se aplica apenas à tabela contábil e tabelas com relação direta a ela - existem outras tabelas no mesmo esquema que serão atualizadas/excluídas normalmente.
Meu entendimento é que, para fins de integridade de dados, esses tipos de restrições devem ser aplicados na camada de banco de dados, mas não consigo encontrar uma maneira limpa e amplamente aceita de fazer isso - esse é um caso de uso em que seria melhor fazê-lo na camada de aplicação?
O ideal seria uma maneira de fazer isso em SQL simples, de modo a ser agnóstico de qual plataforma de banco de dados é usada, pois isso pode estar sujeito a alterações, mas percebo que pode ser pedir demais, então se tiver para ser dependente da plataforma, é preferível algum tipo de MySQL.
Obrigada!
Vejo pelo menos duas maneiras de conseguir isso. A primeira abordagem é não conceder privilégios
DELETE
eUPDATE
nessas tabelas de gravação única ou, nesse caso, quaisquer privilégios além deINSERT
eSELECT
, permitindo apenas que os usuários insiram ou selecionem nelas. Essa opção não tem sobrecarga de desempenho, pois a verificação de privilégio faz parte de qualquer processamento de instrução, mas pode ser substituída por usuários com privilégios elevados, comoroot
.Outra opção é definir
BEFORE UPDATE
eBEFORE DELETE
disparar nessas tabelas e usar aSIGNAL
instrução no corpo do disparador para gerar uma exceção, o que impediria atualizações e exclusões, respectivamente. Há uma pequena penalidade de desempenho que você pagará por isso, mas também alguma segurança adicional, pois mesmo usuários privilegiados não poderão superar o erro sem desabilitar ou descartar os gatilhos.As permissões parecem ser a escolha óbvia - no entanto, você também pode usar o ARCHIVE Storage Engine . Este mecanismo de tabela foi projetado para registrar grandes quantidades de dados que não serão alterados:
A diferença para permissões é que alguém com privilégios estendidos ainda poderá alterar dados na maioria dos outros tipos de tabela, enquanto ARCHIVE não permite que ninguém altere dados que já estejam na tabela.
Procure por " Arquitetura de ponto no tempo " ou " Arquitetura de banco de dados temporal "
Design de banco de dados: uma arquitetura pontual
Banco de dados temporal
As idéias básicas de ambos é que você precisa adicionar dados sem excluir - ou armazenar dados de forma que você possa extrair os dados como existem atualmente... ou existiam em uma data e hora anterior.
questão relacionada aqui: how-to-create-a-point-in-time-architecture-in-mysql ,