Триггер с несколькими таблицами - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь создать триггер, который будет принимать значение из одной таблицы, а затем выполнить вычитание с другим значением в другой таблице.

Триггер будет работать в таблице, может (депозит), и тогда я бы хотел взять значение, которое пользователь только что вставил в таблицу депозитов, и вычесть его значением в другой таблице (аккаунте). У меня нет проблем, чтобы получить следующий код для компиляции:

CREATE OR REPLACE TRIGGER aifer_insättning 
AFTER INSERT
ON deposit
FOR EACH ROW
WHEN (new.belopp is not null)
BEGIN
UPDATE account SET SALDO = saldo + :new.belopp;
end;
/

Но, конечно, это обновление всех строк в учетной записи таблицы. Я перепробовал все, чтобы он работал только с одним рядом, но я не могу его получить. У кого-нибудь есть предложения, как я могу решить эту проблему? Вот мои таблицы:

SQL> desc account
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 KNR                                       NOT NULL NUMBER(8)
 KTNR                                      NOT NULL NUMBER(6)
 REGDATUM                                  NOT NULL DATE
 SALDO                                              NUMBER(10,2)

SQL> desc deposit
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 RADNR                                     NOT NULL NUMBER(9)
 PNR                                       NOT NULL VARCHAR2(11)
 KNR                                       NOT NULL NUMBER(8)
 BELOPP                                             NUMBER(10,2)
 DATUM                                     NOT NULL DATE

Ответы [ 4 ]

2 голосов
/ 17 марта 2011

Предполагая, что общий столбец KNR является первичным ключом ACCOUNT, я думаю, что вам нужен код:

CREATE OR REPLACE TRIGGER aifer_insättning 
    AFTER INSERT
    ON deposit
    FOR EACH ROW
    WHEN (new.belopp is not null)
BEGIN
    UPDATE account a
    SET a.SALDO = a.saldo + :new.belopp
    WHERE a.knr - :new.knr;
end;
/

Обратите внимание, что я добавил псевдоним таблицы, чтобы сделать код более понятным.

2 голосов
/ 17 марта 2011

Разве вам не нужно просто добавить предложение where в оператор update в теле триггера?Или я что-то упустил?

0 голосов
/ 10 апреля 2013

**

Создание триггеров для всех таблиц

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

Но кто-то хотел отслеживать активность на столах, так что это немного проще. Здесь мы создаем одну таблицу журнала, и каждый раз, когда происходит операция DML, она записывается туда.

Наслаждайтесь

USE Northwind GO

CREATE TABLE LOG_TABLE (
  Add_dttm datetime DEFAULT (GetDate()),
  TABLE_NAME sysname,
  Activity char(6)
);

GO

DECLARE
  @sql varchar(8000),
  @TABLE_NAME sysname SET NOCOUNT ON

SELECT @TABLE_NAME = MIN(TABLE_NAME)
FROM INFORMATION_SCHEMA.Tables

WHILE @TABLE_NAME IS NOT NULL
BEGIN
  SELECT @sql = 'CREATE TRIGGER
  [' + @TABLE_NAME + '_Usage_TR]
    ON [' + @TABLE_NAME +'] '
    + 'FOR INSERT, UPDATE, DELETE AS '
    + 'IF EXISTS (SELECT * FROM inserted)
  AND NOT EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE
  (TABLE_NAME,Activity)
  SELECT ''' + @TABLE_NAME + ''', ''INSERT''' + ' '
  + 'IF EXISTS (SELECT * FROM inserted)
  AND EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity) SELECT '''
  + @TABLE_NAME + ''', ''UPDATE''' + ' '
  + 'IF NOT EXISTS (SELECT * FROM inserted)
  AND EXISTS (SELECT * FROM deleted) '
  + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity)
  SELECT ''' + @TABLE_NAME + ''',
  ''DELETE''' + ' GO'

  SELECT @sql EXEC(@sql)

  SELECT @TABLE_NAME = MIN(TABLE_NAME)
  FROM INFORMATION_SCHEMA.Tables
  WHERE TABLE_NAME > @TABLE_NAME
END
SET NOCOUNT OFF
0 голосов
/ 05 января 2013

разделитель $$создать триггер ss_ss перед обновлением на сотрудникадля каждого ряданачатьобновить набор получателейcreate_by = NEW.employee_pinгде create_by = OLD.employee_pin;конец$$разделитель;

ПРИМЕЧАНИЕ. -> сотрудник и получатель - две таблицы

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