2012-06-12 4 views
0

Я как бы новичок в этом, но хочу написать первый простой триггер. Если у меня есть таблица с полями A, B, C. Когда пользователь вставляет или обновляет A и B, я хочу обновить C = A + B с помощью триггера , было бы легко? спасибоОбновление/вставка триггера в той же таблице

+3

какая база данных вы используете? –

+2

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

ответ

2

Вот триггер, который будет делать, как вы просите. Поскольку в моей таблице отсутствует столбец идентификатора, нет способа указать только обновление c для обновленных строк (то есть значение c будет пересчитано для каждой строки для каждой вставки/обновления).

CREATE TRIGGER mytrigger 
ON mytable 
FOR INSERT, UPDATE 
AS 
    UPDATE mytable 
    SET c = COALESCE(a, 0) + COALESCE(b, 0) 

Это было бы подходящим кандидатом для вычисляемого столбца:

CREATE TABLE mytable 
    (
    a INT, 
    b INT, 
    c AS COALESCE(a, 0) + COALESCE(b, 0) 
) 

Редактировать: Пример с идентификатором столбца, чтобы обновить только c обновленных/вставленных строк:

CREATE TRIGGER mytrigger 
ON mytable 
FOR INSERT, UPDATE 
AS 
    UPDATE mytable 
    SET c = COALESCE(a, 0) + COALESCE(b, 0) 
    WHERE ID IN (SELECT ID 
        FROM inserted) 

Я создал SQL Fiddle, где вы можете видеть это в прямом эфире.

Для запуска вам пример SQL Скрипки:

  1. Создать схему, добавить некоторые выборочные данные, а затем добавить определение триггера (так c является безлюдной в этот момент).
  2. Выберите из таблицы, чтобы вы могли видеть значения примера.
  3. Обновить строку, а затем снова выбрать таблицу (вы можете увидеть c ).
  4. Вставьте новую строку, затем снова выберите все из таблицы (c был заселен для этой новой строки).

Чтобы объяснить немного больше о том, как это работает - во время выполнения триггера, SQL-сервер (я предполагаю теперь, что это то, что вы используете) создает две временные таблицы inserted и deleted копии затронутых строк in - мы можем присоединиться или выбрать из этих таблиц, если нам нужно получить данные от них; в этом случае просто получить список идентификаторов, которые были затронуты операцией update/insert, а затем только обновление c для этих строк. Подробнее об этом см. В разделе this MSDN article.

+0

Этот триггер обновлял каждую строку каждый раз, когда что-либо обновлялось. Это связано с проблемой производительности. Вычисленный столбец в любом случае является правильным выбором (вы, возможно, захотите, чтобы он сохранялся хотя бы на SQL Server). – HLGEM

+0

@HLGEM Да, я знаю, я уже упоминал об этом в своем ответе - я предполагаю, что это учебное упражнение, и ОП просто хотел знать, как это можно сделать. Я знаю, что с правильным столбцом идентификатора вы можете присоединиться к таблице «вставлен» в триггере, чтобы обновлять только соответствующие строки, но такой столб не упоминался в схеме примера. Хороший вопрос о 'persisted', но OP все еще не ответил на вопрос о том, какие СУБД они используют! ;-) – Bridge

+0

Спасибо. Это более сложное вычисление. Сначала я пытаюсь изучить концепцию (MS SQL 2008). Это база данных программного обеспечения ERP, поэтому мы не контролируем структуру. Я просто хочу, чтобы это поле C вычислялось и не было уверенным, как работает этот триггер.Да, я должен был упомянуть ID col. Если это действие обновления, где я могу найти совпадение a & b? в моей таблице? мне нужно «выбрать» в вставленном, если он вставлен?
CREATE TRIGGER MyTrigger ПО туЬаЫм для вставки КАК UPDATE туЬаЫе SET, с = СОАЬЕЗСОМ (выбрать из вставлено I, где i.id = ID, 0) + СОАЬЕЗС (выбрать б от вставленного I, где i.id = Id, 0) – HoangMN

Смежные вопросы