удаление данных более чем одной таблицы через SQL-запрос в SQL-сервере - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть мастер-таблица Staff.у меня есть другие таблицы, такие как staffStudy, StaffPenison, visitInfo и т. д. Я не сделал никакой связи между этими таблицами.я хочу знать, что если я удалю таблицу персонала, то можно ли удалить всю информацию об этом персонале из других таблиц?Staff_id используется для представления информации о конкретном персонале.любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2011

Создайте хранимую процедуру, которая удаляет из 12 таблиц.

CREATE PROCEDURE dbo.Staff_Delete
    @Staff_ID INT
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION;

    BEGIN TRY
      DELETE dbo.VisitInfo WHERE Staff_ID = @Staff_ID;
      DELETE dbo.StaffPension WHERE Staff_ID = @Staff_ID;
      DELETE dbo.StaffStudy WHERE Staff_ID = @Staff_ID;
      /* ...other tables... */
      DELETE dbo.Staff WHERE Staff_ID = @Staff_ID;
      COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
      ROLLBACK TRANSACTION;
    END CATCH
END
GO

Теперь ваше событие нажатия кнопки может просто вызвать эту хранимую процедуру, и если вы добавляете таблицы в модель, вам просто нужно изменитьпроцедура вместо изменения всех копий приложения.

Кажется странным, что у вас не было бы связи с внешним ключом здесь;Хотя я согласен с другими, что каскад не относится к производству, поэтому это не поможет решить эту конкретную проблему, но ограничения FK полезны по многим другим причинам.Был ли это осознанный выбор?

0 голосов
/ 18 сентября 2011

Ниже приведен пример триггера.

CREATE TRIGGER Delete_Staff_tables
ON Staff
FOR DELETE
AS
BEGIN
   DECLARE @StaffID INT
   SELECT @StaffID = Staff_ID FROM Deleted
   DELETE FROM StaffStudy WHERE staff_ID = @StaffID
   DELETE FROM StaffPension WHERE staff_ID = @StaffID
   -- Etc
END

Однако убедитесь, что имеет смысл удалить дочерние таблицы. Если сотрудник уходит (и удаляется), он может сильно расстроиться, если тоже потеряет свою пенсию.

Дополнительные комментарии Как предложил Митч, добавление дополнительных удалений в код клиента имеет смысл, поскольку триггер базы данных может вызвать некоторые удаления, о которых другие программисты могут не знать. Однако, если вы выполняете 12 дополнительных запросов в своем клиентском коде, обязательно заключите их в транзакцию. Какое влияние это окажет на вашу систему, если 3-6 запросов на удаление пройдут успешно, а остальные нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...