Pregunta

Estoy implementando CRUD en mi aplicación de Silverlight, sin embargo, no quiero implementar la funcionalidad Eliminar de la forma tradicional, en cambio me gustaría configurar los datos para que se oculten dentro de la base de datos.

¿Alguien sabe de una manera de hacer esto con una base de datos de SQL Server?

Ayuda muy apreciada.

¿Fue útil?

Solución

Extendiendo la idea de Lukasz, una columna de fecha y hora también es útil.

  • NULL = actual
  • Valor = cuando se borra por software

Esto agrega una versión simple que una columna de bits no puede funcionar mejor

Otros consejos

Puede agregar otra columna a la tabla " eliminado " que tiene un valor de 0 o 1, y muestra solo aquellos registros con borrado = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

También puedes crear una vista que solo tome filas sin eliminar.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0

Y el comando de eliminar se vería así:

UPDATE TheTable SET deleted = 1 WHERE id = ...

En la mayoría de las situaciones, prefiero archivar las filas eliminadas en una tabla de archivo con un desencadenador de eliminación. De esta manera también puedo capturar quién eliminó cada fila y las filas eliminadas no afectan mi rendimiento. Luego puede crear una vista que une ambas tablas cuando desee incluir las eliminadas.

Puede hacerlo como Lukasz Lysik sugiere , y tiene un campo que sirve como indicador para " eliminado " filas, filtrándolas cuando no quieras que aparezcan. Lo he usado en varias aplicaciones.

Una sugerencia alternativa sería agregar una asignación de estado adicional si hay un código de estado preexistente. Por ejemplo, en una aplicación de asistencia de clase, usamos internamente un registro de asistencia que podría ser "Importado", "Registrado", "Completado", "Incompleto", etc. *: agregamos un "Eliminado". Opción para tiempos donde haya duplicados involuntarios. De esa manera tenemos un registro y no solo estamos lanzando una nueva columna al problema.

* Ese es el nombre para mostrar de un código numérico usado detrás de las escenas. Sólo aclarando. :)

Solución con disparadores

Si eres amigo con el desencadenador de DB, entonces deberías considerar:

  • agregue las columnas DeletedAt y DeletedBy a sus tablas
  • cree una vista para cada tabla (por ejemplo, para la tabla Customer tenga una vista CustomerView , que filtraría las filas que tienen DeletedAt no nulo (idea de gbn con columnas de fecha)
  • todas sus operaciones CRUD se realizan como de costumbre, pero no en la tabla Customer , sino en la ClustomerView
  • agregue el desencadenante INSTEAD OF DELETE que marcaría la fila como eliminar en lugar de eliminarla físicamente.
    • es posible que desee hacer cosas un poco más complejas, como asegurarse de que todas las referencias de FK a esta fila también sean " lógicamente " eliminado para seguir teniendo lógica integridad referencial

Si elige usar este patrón, probablemente nombre mis tablas de forma diferente como TCustomer, y visualice solo Customer para mayor claridad del código del cliente.

Tenga cuidado con este tipo de implementación, ya que la eliminación suave rompe la integridad referencial y tiene que imponer la integridad en sus entidades usando una lógica personalizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top