sql-server - foreign - eliminar en cascada sql server 2012
¿Cómo uso la eliminación en cascada con SQL Server? (7)
Tengo 2 tablas: T1 y T2, son tablas existentes con datos. Tenemos una relación de uno a muchos entre T1 y T2. ¿Cómo modifico las definiciones de la tabla para realizar la eliminación en cascada en SQL Server cuando se elimina un registro de T1? También se eliminan todos los registros asociados en T2.
La restricción extranjera está en su lugar entre ellos. No quiero eliminar las tablas ni crear un desencadenante para realizar la eliminación de T2. Por ejemplo, cuando borro a un empleado, todo el registro de revisión también debería haber desaparecido.
T1 - Empleado,
Employee ID
Name
Status
T2 - Revisiones de rendimiento,
Employee ID - 2009 Review
Employee ID - 2010 Review
Creo que no puede simplemente eliminar la propiedad de las tablas, si estos son datos de producción reales, simplemente elimine los contenidos que no afectan el esquema de la tabla.
Necesitaras,
- Eliminar la restricción de clave externa existente,
- Agregue uno nuevo con el ajuste
ON DELETE CASCADE
habilitado.
Algo como:
ALTER TABLE dbo.T2
DROP CONSTRAINT FK_T1_T2 -- or whatever it''s called
ALTER TABLE dbo.T2
ADD CONSTRAINT FK_T1_T2_Cascade
FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE
Para agregar "Eliminar en cascada" a una clave externa existente en SQL Server Management Studio:
Primero, seleccione su clave externa y abra "DROP y Create To .." en una nueva ventana de consulta.
Luego, simplemente agregue ON DELETE CASCADE
al comando ADD CONSTRAINT
:
Y pulsa el botón "Ejecutar" para ejecutar esta consulta.
Por cierto, para obtener una lista de sus Claves foráneas y ver cuáles tienen "Eliminar en cascada" activada, puede ejecutar este script:
SELECT
OBJECT_NAME(f.parent_object_id) AS ''Table name'',
COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ''Field name'',
delete_referential_action_desc AS ''On Delete''
FROM sys.foreign_keys AS f,
sys.foreign_key_columns AS fc,
sys.tables t
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1
Y si alguna vez descubre que no puede DROP
una tabla en particular debido a una restricción de Clave Externa, pero no puede determinar qué FK está causando el problema, entonces puede usar el SQL que proporcioné aquí:
¿Cómo puedo enumerar todas las claves foráneas que hacen referencia a una tabla dada en SQL Server?
El SQL en ese artículo enumera todos los FK que hacen referencia a una tabla en particular.
Espero que todo esto ayude.
Particularmente el dedo largo.
Puedes hacer esto con SQL Server Management Studio.
→ Haga clic con el botón derecho en el diseño de la tabla y vaya a Relaciones y elija la clave externa en el panel del lado izquierdo y en el panel del lado derecho, expanda el menú "Especificación INSERTAR y ACTUALIZAR" y seleccione "Cascada" como Regla de eliminación.
Usa algo como
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
Rellene los nombres de columna correctos y debe estar configurado. Como ha indicado correctamente mark_s, si ya tiene una restricción de clave externa en su lugar, tal vez deba eliminar la antigua primero y luego crear la nueva.
ON DELETE CASCADE
Especifica que los datos secundarios se eliminan cuando se eliminan los datos principales.
CREATE TABLE products
( product_id INT PRIMARY KEY,
product_name VARCHAR(50) NOT NULL,
category VARCHAR(25)
);
CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
product_id INT NOT NULL,
quantity INT,
min_level INT,
max_level INT,
CONSTRAINT fk_inv_product_id
FOREIGN KEY (product_id)
REFERENCES products (product_id)
ON DELETE CASCADE
);
Para esta clave externa, hemos especificado la cláusula ON DELETE CASCADE
que le indica a SQL Server que elimine los registros correspondientes en la tabla secundaria cuando se eliminan los datos en la tabla principal. Entonces, en este ejemplo, si un valor product_id se elimina de la tabla de productos, los registros correspondientes en la tabla de inventario que usan este product_id también se eliminarán.
Primero para habilitar la propiedad ONCascade:
1.Seque la restricción de clave externa existente
2. agregue uno nuevo con la configuración ON DELETE CASCADE habilitada
Ex:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N''dbo.Response''))
BEGIN
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
ELSE
BEGIN
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
Segundo para deshabilitar la propiedad ONCascade:
1.Seque la restricción de clave externa existente
2.Agregue uno nuevo con el ajuste ON DELETE NO ACTION habilitado
Ex:
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N''dbo.Response''))
BEGIN
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
ELSE
BEGIN
ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request] FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION
END