<Имя столбца> недопустимо в контексте, где оно используется. - PullRequest
0 голосов
/ 19 марта 2019

Я уже некоторое время работал над этим триггером ...

Я использую IBM Data Studio 4.1.3 при создании этого триггера.Сначала у меня были проблемы с завершением утверждений с помощью ';'но на веб-сайте IBM написано «x», и он работает.

Моя главная проблема, однако, мне интересно, почему я получаю это сообщение:

‬‪‬‎"‪N.ITEMNAME"‬‎ ‪is‬‎ ‪not‬‎ ‪valid‬‎ ‪in‬‎ ‪the‬‎ ‪context‬‎ ‪where‬‎ ‪it‬‎ ‪is‬‎ ‪used‬‎.‪‬‎.‪‬‎ ‪SQLCODE‬‎=‪‬‎-‪206‬‎,‪‬‎ ‪SQLSTATE‬‎=‪42703‬‎,‪‬‎ ‪DRIVER‬‎=‪3‬‎.‪69‬‎.‪56

Это относится и ко всемдругие: o.itemid, o.quantity и n.quantity.Я узнал об этом, переключая / меняя имена вокруг друг друга.

Редактор говорит мне, что в заявлении нет ошибок, но при выполнении возникают проблемы.

-- <ScriptOptions statementTerminator="x" />
CREATE TRIGGER DB2ADMIN.SUPPLIES_I
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW TABLE AS n 
            OLD TABLE AS o 
FOR EACH ROW MODE DB2SQL NOT SECURED
BEGIN ATOMIC
    INSERT INTO db2admin.tran_log VALUES (USER, CURRENT TIMESTAMP || ' ' || n.itemname || ' ( ' || o.itemid || ' ) from ' || CHAR(o.quantity) || ' to ' || CHAR(n.quantity));
END

1 Ответ

0 голосов
/ 19 марта 2019

Удалите слово TABLE из оператора CREATE TRIGGER:

CREATE TRIGGER DB2ADMIN.SUPPLIES_I
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW AS n 
            OLD AS o 
FOR EACH ROW MODE DB2SQL NOT SECURED
BEGIN ATOMIC
    INSERT INTO db2admin.tran_log VALUES (USER, CURRENT TIMESTAMP || ' ' || n.itemname || ' ( ' || o.itemid || ' ) from ' || CHAR(o.quantity) || ' to ' || CHAR(n.quantity));
END

Вы не можете ссылаться на переменную перехода таблицы так, как пытаетесь.Представьте, что мы создаем таблицу new, как показано ниже.

Это возможно:

with n(i) as (values 1, 2, 3)
select i 
from n;

Это невозможно, и вы получаете то же сообщение об ошибке:

with n(i) as (values 1, 2, 3)
values (n.i);

Альтернативное решение с FOR EACH STATEMENT триггером

Если у вашей таблицы есть ключ (один или несколько столбцов), и он не содержит обновленный столбец QUANTITY:

CREATE TRIGGER DB2ADMIN.SUPPLIES_I2
AFTER UPDATE OF QUANTITY ON DB2ADMIN.SUPPLIES
REFERENCING NEW TABLE AS n 
            OLD TABLE AS o 
FOR EACH STATEMENT
INSERT INTO db2admin.tran_log 
SELECT USER, CURRENT TIMESTAMP || ' ' || n.itemname || ' ( ' || o.itemid || ' ) from ' || CHAR(o.quantity) || ' to ' || CHAR(n.quantity)
FROM n, o
WHERE n.<key>=o.<key>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...