Создайте процедуру, которая удаляет данные из нескольких таблиц. SQL Сервер - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужно создать процедуру, которая позволит мне удалять данные из нескольких таблиц одновременно, просматривая CUIT. Здесь показаны четыре таблицы:

enter image description here

Я должен передать значение CUIT, и, если оно совпадает с любым элементом, сохраненным в базе данных, я нужно это удалить. Я не мог найти синтаксис, чтобы можно было стирать более двух таблиц одновременно, если бы вы могли мне помочь, я был бы очень признателен. Я сомневаюсь, что процедура на самом деле намного больше, в общей сложности это будет около 12 таблиц, но, поскольку меня интересует только синтаксис, я пропускаю этот фрагмент.

У меня проблемы с попыткой объединения таблиц с использованием INNER JOIN.

Я использую SQL Server 2016. Спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

В случае, если вы не хотите изменять схему базы данных, вы можете go для INSTEAD OF TRIGGER.

Триггер позволяет выполнять любые задачи при выполнении определенного действия. В этом случае вы можете написать INSTEAD OF DELETE триггер на вашей родительской / основной таблице, а внутри триггера вы можете удалить связанные записи из дочерних таблиц. Посмотрите на приведенный ниже пример.

CREATE TABLE dbo.Gestiones
(
    id_gestione int IDENTITY (1, 1) PRIMARY KEY,
    CUIT INT
);

CREATE TABLE dbo.ChildGestione1
(
    ID INT IDENTITY PRIMARY KEY,
    id_gestioneFK int REFERENCES Gestiones(id_gestione),
    Description VARCHAR(100)
);

CREATE TABLE dbo.ChildGestione2
(
    ID INT IDENTITY PRIMARY KEY,
    id_gestioneFK int REFERENCES Gestiones(id_gestione),
    Description VARCHAR(100)
);

CREATE TABLE dbo.ChildGestione3
(
    ID INT IDENTITY PRIMARY KEY,
    id_gestioneFK int REFERENCES Gestiones(id_gestione),
    Description VARCHAR(100)
);


INSERT INTO dbo.Gestiones (CUIT)
VALUES (10), (20), (30), (40);

INSERT INTO dbo.ChildGestione1 (id_gestioneFK, Description)
VALUES (1,'abc'), (2,'efg');

INSERT INTO dbo.ChildGestione2 (id_gestioneFK, Description)
VALUES (1,'abc'), (3,'pqr');

INSERT INTO dbo.ChildGestione3 (id_gestioneFK, Description)
VALUES (1,'abc'), (3,'pqr'), (4,'stu');

GO


SELECT * FROM dbo.Gestiones
SELECT * FROM dbo.ChildGestione1
SELECT * FROM dbo.ChildGestione2
SELECT * FROM dbo.ChildGestione3

DELETE FROM Gestiones where CUIT = 10

SELECT * FROM dbo.Gestiones
SELECT * FROM dbo.ChildGestione1
SELECT * FROM dbo.ChildGestione2
SELECT * FROM dbo.ChildGestione3


CREATE TRIGGER InsteadOfDELETETriggerExample ON [Gestiones]
INSTEAD OF DELETE
AS 
BEGIN
    DECLARE @id_gestione INT

    SELECT @id_gestione = id_gestione FROM deleted

    IF @id_gestione IS NOT NULL
    BEGIN
        DELETE FROM ChildGestione1 WHERE id_gestioneFK = @id_gestione
        DELETE FROM ChildGestione2 WHERE id_gestioneFK = @id_gestione
        DELETE FROM ChildGestione3 WHERE id_gestioneFK = @id_gestione
        /*...
        and so on...you can right as many child tables as you have
        */

        -- At the last, delete the entry from parent table
        DELETE FROM Gestiones WHERE id_gestione = @id_gestione
    END

    PRINT 'Successfully deleted references of CUIT column from all the child tables.'
END
GO


DROP TRIGGER InsteadOfDELETETriggerExample
GO

DROP TABLE dbo.ChildGestione3;
DROP TABLE dbo.ChildGestione2;
DROP TABLE dbo.ChildGestione1;
DROP TABLE dbo.Gestiones;

Вышеприведенный код будет работать только для одной записи удаления в основной таблице, если операция удаления затрагивает более одной записи в родительской таблице, вам необходимо JOIN deleted таблица с вашими дочерними таблицами для удаления.

0 голосов
/ 20 февраля 2020

Учитывая ваш дизайн, я бы применил Каскадирование к вашему внешнему ключу. Это пример, но вы должны выбрать правильный путь:

USE Sandbox;
GO

CREATE TABLE dbo.ParentTable (PK int IDENTITY PRIMARY KEY,
                              I int);

CREATE TABLE dbo.ChildTable1 (PK int IDENTITY PRIMARY KEY,
                              FK int,
                              S varchar(10));

CREATE TABLE dbo.ChildTable2 (PK int IDENTITY PRIMARY KEY,
                              FK int,
                              S varchar(10));

CREATE TABLE dbo.ChildTable3 (PK int IDENTITY PRIMARY KEY,
                              FK int,
                              S varchar(10));
GO
--Create keys with CASCADE ON DELETE
ALTER TABLE dbo.ChildTable1 ADD CONSTRAINT FK1 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO
ALTER TABLE dbo.ChildTable2 ADD CONSTRAINT FK2 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO
ALTER TABLE dbo.ChildTable3 ADD CONSTRAINT FK3 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO


INSERT INTO dbo.ParentTable (I)
VALUES(1),(7),(9);

INSERT INTO dbo.ChildTable1 (FK,
                            S)
VALUES(1,'abc'),(3,'def');

INSERT INTO dbo.ChildTable2 (FK,
                            S)
VALUES(1,'xyz'),(2,'qwe');

INSERT INTO dbo.ChildTable3 (FK,
                            S)
VALUES(1,'123');
GO

SELECT *
FROM dbo.ParentTable PT
     LEFT JOIN dbo.ChildTable1 CT1 ON PT.PK = CT1.PK
     LEFT JOIN dbo.ChildTable2 CT2 ON PT.PK = CT2.PK
     LEFT JOIN dbo.ChildTable3 CT3 ON PT.PK = CT3.PK;

--1, as we're going to DELETE that
SELECT *
FROM dbo.ChildTable1 CT1
WHERE CT1.FK = 1;

SELECT *
FROM dbo.ChildTable1 CT2
WHERE CT2.FK = 1;

SELECT *
FROM dbo.ChildTable1 CT3
WHERE CT3.FK = 1;
GO

--Perform the DELETE, which will CASCADE to the child tables.    
DELETE FROM dbo.ParentTable
WHERE PK = 1;
GO
--no rows
SELECT *
FROM dbo.ParentTable PT
     LEFT JOIN dbo.ChildTable1 CT1 ON PT.PK = CT1.PK
     LEFT JOIN dbo.ChildTable2 CT2 ON PT.PK = CT2.PK
     LEFT JOIN dbo.ChildTable3 CT3 ON PT.PK = CT3.PK;

SELECT *
FROM dbo.ChildTable1 CT1
WHERE CT1.FK = 1;

SELECT *
FROM dbo.ChildTable1 CT2
WHERE CT2.FK = 1;

SELECT *
FROM dbo.ChildTable1 CT3
WHERE CT3.FK = 1;

GO
DROP TABLE dbo.ChildTable3;
DROP TABLE dbo.ChildTable2;
DROP TABLE dbo.ChildTable1;
DROP TABLE dbo.ParentTable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...