Триггер DML, создающий новые строки для нескольких клиентов после вставки / обновления / удаления - PullRequest
0 голосов
/ 16 марта 2020

Я использую SQL Сервер 2017.

Чего я хочу достичь : База данных содержит таблицы для клиентов, коды купонов и поставщиков. Клиент - это компания. Клиент может быть независимой компанией, он может принадлежать другой компании, и у него могут быть «дочерние компании» (связь между дочерними и родительскими компаниями устанавливается через столбец ParentID в таблице клиентов).

Купон коды связаны с клиентами. Когда «родительская компания» активирует доступ к коду купона, он должен стать доступным для всех дочерних компаний материнской компании. Аналогичным образом, если родительская компания деактивирует доступ к коду купона, дочерние компании также должны потерять доступ. На сегодняшний день это должно быть исправлено вручную. Я пишу триггер, который возьмет на себя эту ручную задачу.

Таблица CompanyCodes хранит отношения между компаниями и кодами купонов. В столбце «Клиент» хранится идентификационный номер компании, в столбце «Поставщик» хранится идентификатор поставщика кода купона, а в столбце «Код» хранится код купона.

Всякий раз, когда строка вставляется, обновляется или удаляется в / из таблицы CompanyCodes триггер сначала проверяет, есть ли у соответствующего клиента дочерние компании. Если это так, триггер должен вставлять / обновлять / удалять строки для каждой дочерней компании компании, чтобы изменения отражались во всех из них.

Например, клиент 1 является родителем клиента 2 и клиент 3. Клиент 1 активирует доступ к новому коду купона для поставщика X, и в CompanyCodes вставляется новая строка с соответствующей информацией. В этом случае триггер должен вставить две новые строки в таблицу, одну для клиента 2 и одну для клиента 3, где вся информация (кроме идентификатора компании) такая же, как и для клиента 1.

Где я застрял: Как мне выполнить эту работу в тех случаях, когда у клиента есть несколько дочерних компаний?

Вот соответствующая часть моего запроса в его нынешнем виде (это все в операторе IF, который выполняется, когда действие запуска триггера «INSERTED»)

DECLARE @insertedSupplier AS INT
DECLARE @insertedCode AS VARCHAR(50)

SET @insertedSupplier = (SELECT Supplier FROM inserted)
SET @insertedCode = (SELECT Code FROM inserted)


    INSERT INTO dbo.CompanyCodes (Customer, Supplier, Code)
    VALUES ((SELECT id FROM Customers WHERE Customers.ParentID = (SELECT Customer FROM inserted))
            ,@insertedSupplier, @insertedCode)

Если существует максимально одна возможная дочерняя компания, вышеприведенное должно работать. Но когда их несколько, "(SELECT id FROM Customers WHERE Customers.ParentID = (SELECT Customer FROM вставлено)" вернет несколько строк.

Какой самый простой (и желательно наилучший способ?) Способ сделать что Я хочу сделать здесь?

Изменить с примером, показывающим желаемый результат:

Таблица клиентов

| Customer | ID | ParentID |
|----------|----|----------|
|Customer1 |  1 | NULL     | 
|Customer2 |  2 |   1      |
|Customer3 |  3 |   1      | 

Customer1 затем приступает к активации доступа к новый код купона, и таблица CompanyCodes изменится на следующее:

| Customer | Supplier |   Code   |
|----------|----------|----------|
|Customer1 |  123456  | abcdefgh | 

Затем сработает триггер и добавит по одной строке для каждой из двух дочерних компаний Customer1 (где вся информация, кроме имени клиента, то же самое, что и для Customer1):

| Customer | Supplier |   Code   |
|----------|----------|----------|
|Customer1 |  123456  | abcdefgh | 
|Customer2 |  123456  | abcdefgh |
|Customer3 |  123456  | abcdefgh |

Edit 2: Кроме того, как работают наши системы, никогда не бывает более одной вставки / обновления / удаления строки в таблица CompanyCodes (без пакетных заданий)

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