нужна помощь, чтобы написать триггер - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть три таблицы:

Заказы: orderid, valuedid, valuesdesc

Клиенты: customerid, cutomdesc

Группа: groupid, groupdesc

valueid - идентификатор клиента или группы

valuesdesc - должен заполняться соответствующим для вставленного valueid описанием из Customers или Groups в зависимости от того, какой (клиент или группа) пользователь выбрал в клиенте.

Таким образом, когда клиент отправляет запрос на вставку для Orders, он состоит из orderid для нового заказа и valuedid. А на стороне клиента я знаю, какой пользователь выбрал: группу или клиента.

Что мне нужно: если в Orders вставлена ​​новая строка, соответствующая valuesdesc для valuedid из Клиентов или Групп, вставленных в столбец valuesdesc.

У меня есть идея вставить новую запись заказа valuesdesc, которая будет содержать ложное значение ключа для выбора правильного словаря (клиентов или групп), но как создать этот триггер, к сожалению, я пока не знаю.

1 Ответ

2 голосов
/ 12 февраля 2011

Во-первых, я должен сказать, что это очень необычный дизайн. Когда вы вставляете запись в Orders, вы используете valuesdesc, чтобы намекнуть на таблицу, на которую ссылается valueid. Но как только valuesdesc заполняется триггером, valueid по существу теряет всякий смысл. То есть вы не сообщили нам, что у вас есть какой-то другой способ отличить ссылку на Customers от ссылки на Groups. Таким образом, вы также можете полностью удалить valueid и использовать valuesdesc для передачи подсказки «словаря» и ссылки в этой таблице.

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

В любом случае, в вашем нынешнем дизайне вы можете попробовать это:

CREATE TRIGGER Orders_UpdateValuesdesc
ON Orders
FOR INSERT
AS
UPDATE o
SET valuesdesc = COALESCE(c.customdesc, g.groupdesc)
FROM Orders o
  INNER JOIN inserted ON o.orderid = i.orderid
  LEFT JOIN Customers c ON i.valuesdesc = 'Customers'
    AND i.valueid = c.customerid
  LEFT JOIN Groups g ON i.valuesdesc = 'Groups'
    AND i.valueid = g.customerid

Строки 'Customers' и 'Groups' означают спецификаторы словаря. Вы заменяете их фактическими значениями.

Триггер использует LEFT JOIN для объединения Customers и Groups, затем заполняет Orders.valuesdesc либо customdesc, либо groupdesc, в зависимости от того, какое из них не равно нулю.

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