c# - stop - Tabla truncada de SQL Server: descarte y vuelva a crear la secuencia de comandos FK constraints
sql server script to disable foreign key (2)
Estoy escribiendo una pequeña aplicación (en c #) que me ayuda a truncar tablas en SQL Server 2005/08. Para truncar la tabla, creo que necesito hacer esto:
- descartar todas las restricciones FK de la tabla,
- truncar la mesa,
- recrear todas las restricciones eliminadas previamente.
¿Alguien puede ayudarme a crear un guión así o señalarme dónde puedo encontrar algunas pistas?
Saludos
Bueno, puedes hacer esto desde tu aplicación:
- ejecuta un comando SQL en tu base de datos existente para encontrar todas las restricciones de clave externa
- de esa lista de restricciones de clave externa, crea dos scripts
- uno para eliminar todas las restricciones de clave externa existentes (antes de truncar las tablas)
- un segundo para volver a crear las restricciones de clave externa después de haber truncado las tablas
Puede hacerlo inspeccionando la vista del catálogo del sistema.
Esta consulta aquí le dará una lista de todas las restricciones de clave externa:
select
fk.name,
object_name(fk.parent_object_id) ''Parent table'',
c1.name ''Parent column'',
object_name(fk.referenced_object_id) ''Referenced table'',
c2.name ''Referenced column''
from
sys.foreign_keys fk
inner join
sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
inner join
sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id
inner join
sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
Al combinar estos elementos, puede crear la lista de comandos DROP CONSTRAINT
que se ejecutarán antes del truncamiento de las tablas:
select
''ALTER TABLE dbo.'' + object_name(fk.parent_object_id) +
'' DROP CONSTRAINT '' + fk.name
from
sys.foreign_keys fk
y también puede crear los scripts ALTER TABLE
que se ejecutarán después del truncamiento para restaurar las relaciones de claves foráneas.
select
''ALTER TABLE dbo.'' + object_name(fk.parent_object_id) +
'' ADD CONSTRAINT '' + fk.name +
'' FOREIGN KEY('' + c1.name + '') REFERENCES dbo.'' +
object_name(fk.referenced_object_id) + ''('' + c2.name + '')''
from
sys.foreign_keys fk
inner join
sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
inner join
sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id
inner join
sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
Para estas dos consultas, es un proceso de dos pasos:
- primero ejecute la consulta que muestro usando C # y ADO.NET contra su base de datos
- esto producirá una salida que es una lista de comandos T-SQL (para DROP o recrear las relaciones FK)
- tome la salida y, en un segundo paso, ejecute esa salida como un lote de comandos T-SQL desde su aplicación C # / ADO.NET.
Limitación: en este momento, el script asume y funciona solo si tiene claves externas de una sola columna; si no tienes eso, es posible que necesites ajustar un poco las secuencias de comandos.
En Enterprise Manager:
- Seleccione la tabla,
- Haga clic con el botón derecho en la tabla, seleccione Todas las tareas -> Generar secuencias de comandos SQL,
- Desactivar tilde Generar el lanzamiento y generar el Crear ,
- Haga clic en la pestaña Opciones,
- Marque todos los elementos debajo de Opciones de scripting de tabla
- Haga clic de nuevo en la pestaña General,
- Haga clic en Vista previa,
- Copie el contenido a un Bloc de notas,
- Ahora tiene todo su script para volver a crear los índices / claves / restricciones.
Con un poco de masaje de este trozo de script, puede hacer su drop constraint
drop index
y drop index
declaraciones de drop index
. Elimine cualquier índice agrupado al final, o de lo contrario estará reconstruyendo los otros índices a medida que avanza.
Ejecute sus gotas, trunque la tabla y luego ejecute las creaciones que creó.
Además: realice una copia de seguridad de la base de datos justo después de que haya hecho esto, ya que cualquier declaración de truncate table
coloca el registro de transacciones en un estado incierto, ya que las declaraciones de truncate table
no se registran.