Que tal como están ?, con ganas de leer un poco sobre MS SQL Server, bueno bárbaro pasemos a lo concreto.
Hoy les voy a comentar una particularidad entre las sentencias ‘TRUNCATE TABLE’ y ‘DELETE’ para eliminar datos entre tablas con integridad referencial. Escenario: Nos han solicitado realizar una migración de datos entre bases de usuario donde los dbms son los reconocidos MSSQL70 y MSSQL2K5, donde el origen de datos es el SQL70 y el destino es un SQL2K5. Este proceso se lleva a cabo con los chequeos de datos a migrar, backup, inhabilitacion de constraints , FK, Triggers y chequeos posteriores a la migración. Cabe destacar la complejidad del mismo pues, no se realiza solo para un motor en particular sino para diversas bases de datos, sin utilizar SSIS ni SMO, sino todo a través de TSQL y command script (cmd-windows batch) del OS. Todo el procedimiento es automático a través de script’s parametrizables. Dicho procedimiento actúa como una caja negra, en donde se le envían parámetros los procesa, genera script’s en base a información recolectada y los ejecuta.(Igualmente en otra ocasión explicare con mas detalles el procedimiento y presentare script’s de ejemplo, que les pueden llegar a resultar útiles).
Ya que tenemos una visión general del tema, les paso a explicar el problema resultante con la sentencia ‘TRUNCATE TABLE’ y la solución con ‘DELETE’.
Una vez inhabilitada la integridad referencial entre todas las tablas de la base en este caso ‘DB1‘ al querer realizar un TRUNCATE TABLE de una de las tablas que es referencia por otra nos surge el siguiente error:
Msg 4712, Level 16, State 1, Line 1
Cannot truncate table 'HumanResources.Employee' because it is being referenced by a FOREIGN KEY constraint.
Aparentemente la sentencia TRUNCATE TABLE no chequea la inhabilitación de los CONTRAINT FK. Como solucionamos esto?, utilizando la sentencia DELETE que si realiza este control y elimina los datos correctamente.
Más adelante les explicare porque siempre trato de Utilizar la sentencia truncate y no delete.
Bueno espero que les sirva y les mando un abrazo virtual a todos.
JuanPL
Link's relacionados:
http://www.todosql.com/blog/200703/truncate-table-vs-delete