SQL Server banco de dados - Hidden Fields?
-
05-07-2019 - |
Pergunta
Estou implementando CRUD no meu aplicativo Silverlight, no entanto eu não quero para implementar a funcionalidade de exclusão na forma tradicional, ao invés disso eu gostaria de definir os dados para ser escondido em vez dentro do banco de dados.
Alguém sabe de uma maneira de fazer isso com um banco de dados SQL Server?
Ajuda muito apreciada.
Solução
Estendendo ideia Lukasz', uma coluna de data e hora também é útil.
- NULL = corrente
- Valor = quando suave Suprimido
Isso adiciona simples de versões que uma coluna bit não pode, que pode funcionar melhor
Outras dicas
Você pode adicionar outra coluna para a mesa "excluído", que tem valor 0 ou 1, e exibir apenas os registros com deleted = 0.
ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0
Você também pode criar vista que leva apenas linhas não excluídos.
CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0
E você comando delete ficaria assim:
UPDATE TheTable SET deleted = 1 WHERE id = ...
Na maioria das situações eu prefiro arquivar as linhas excluídas para uma tabela de arquivo com um disparador de exclusão. Desta forma, eu também pode capturar quem apagou cada linha e as linhas excluídas não afeta minha performance. Você pode então criar uma visão que os sindicatos ambas as tabelas juntos quando você quer incluir os excluídos.
Você poderia fazer como Lukasz Lysik sugere , e ter um campo que serve como uma bandeira para as linhas "excluído", filtrá-los para fora quando você não quer que eles aparecendo. Eu usei isso em um número de aplicações.
Uma sugestão alternativa seria adicionar uma atribuição de status extra se há um código de status pré-existente. Por exemplo, em um aplicativo de classe atendimento usamos internamente um recorde de público poderia ser "importados", "Registered", "Concluído", "Incomplete", etc. * - nós adicionamos uma opção de "excluídos" para os tempos em que há duplicatas não intencionais . Dessa forma, temos um registro e não estamos apenas jogando uma nova coluna para o problema.
* Esse é o nome de exibição de um código numérico utilizado nos bastidores. Apenas esclarecendo. :)
Solução com gatilhos
Se você é amigo de DB gatilho, então você pode considerar:
- adicionar colunas
DeletedAt and DeletedBy
a suas tabelas - criar uma exibição para cada tabelas (ex: para a tabela
Customer
ter uma visãoCustomerView
, o que filtrar linhas que têmDeletedAt
não nula (idéia de gbn com colunas de data) - todas as suas operações CRUD executar como de costume, mas não na mesa de
Customer
, mas naCustomerView
- gatilho add
INSTEAD OF DELETE
que marcaria a linha de exclusão em vez de excluí-lo fisicamente.- você pode querer fazer um pouco mais coisas complexo há como garantir que todas as referências FK para esta linha também são "logicamente" excluído, a fim de ainda ter lógica integridade referencial
Eu você optar por usar este padrão, eu provavelmente teria o nome minhas tabelas de forma diferente como TCustomer,
e vistas apenas Customer
para maior clareza de código do cliente.
Tenha cuidado com este tipo de aplicação, porque exclui suaves quebrar a integridade referencial e você tem que impor a integridade de suas entidades usando lógica personalizada.