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.

Foi útil?

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ão CustomerView, o que filtrar linhas que têm DeletedAt 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 na CustomerView
  • 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top