Base de datos SQL Server - ¿Campos ocultos?
-
05-07-2019 - |
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.
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 vistaCustomerView
, que filtraría las filas que tienenDeletedAt
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 laClustomerView
- 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.