Триггер Oracle для условного аудита вставки - PullRequest
0 голосов
/ 24 сентября 2019

У меня небольшая проблема, я практикую триггеры в Oracle. Я пытался создать триггер, который при вставке записи в таблицу, чье поле (числовое значение) имеет значение больше 20 000, немедленно записывается в историю сдата, описание (запись больше 2000000), идентификатор списка и какой пользователь вставил запись.

Это таблица для сохранения истории:

  CREATE TABLE RESERVA
  (
  ID INT,
  FECHA DATE,
  USUARIO VARCHAR2(10),
  DESCRIPCION VARCHAR2(20)
  );


y este es el trigger que he intentado hacer pero no me funciona

-----TRIGGER--
CREATE OR REPLACE TRIGGER INSERTELO
AFTER INSERT
ON DATOS
DECLARE

ID int,
Marital_Status varchar2(10),
Gender varchar2 (8),
Income float,
Children int,
Education varchar2(20),
Occupation varchar2(20),
Home_Owner varchar2 (5),
Cars int,
Commute_Distance varchar2(15),
Region varchar2 (13),
Age int,
Purchased_Bike varchar2 (5)
BEGIN
SELECT (@ID=ID, @MARITAL_STATUS=MARITAL_STATUS, @GENDER=GENDER, @INCOME=INCOME, @CHILDREN=CHILDREN, @EDUCATION=EDUCATION, @OCUPPATION=OCCUPATION, @HOME_OWNER=HOME_OWNER, @CARS=CARS, @COMMUTE_DISTANCE=COMMUTE_DISTANCE,@REGION=REGION, @AGE=AGE, @PURCHASED_BIKE=PURCHASED_BIKE) FROM INSERTED
INSERT INTO DATOS VALUES (@ID, @MARITAL_STATUS, @GENDER, @INCOME, @CHILDREN, @EDUCATION, @OCUPPATION, @HOME_OWNER, @CARS, @COMMUTE_DISTANCE,@REGION, @AGE, @PURCHASED_BIKE)

IF @INCOME>2000000
INSERT INTO RESERVA (@ID, SYSDATE, USER, 'EL REGISTRO SUPERO LOS 2 MILLONES')

1 Ответ

0 голосов
/ 24 сентября 2019

Предполагая, что это действительно база данных Oracle, а не SQL Server, объекта inserted нет, переменные не имеют префикса @, а псевдозапись :new.Вы должны указать, есть ли у вас триггер на уровне строк или триггер на уровне операторов (или составной триггер, состоящий из частей на уровне строк и операторов).В вашем заявлении insert отсутствует предложение values.Хотя это не является строго обязательным, каждый insert должен явно перечислять столбцы, в которые вы вставляете.В противном случае вы пишете код, который сломается, как только кто-то добавляет новый столбец в таблицу (и вводит всевозможные ошибки, когда один разработчик не помнит порядок столбцов в таблице правильно).И каждое утверждение должно заканчиваться точкой с запятой.

Так что вы хотите что-то вроде

CREATE OR REPLACE TRIGGER INSERTELO
  AFTER INSERT ON DATOS
  FOR EACH ROW
BEGIN
  IF :new.INCOME>2000000
  THEN
    INSERT INTO RESERVA( id, fecha, USUARIO, DESCRIPCION )
      VALUES (:new.id, SYSDATE, USER, 'EL REGISTRO SUPERO LOS 2 MILLONES');
  END IF;
END;

Google переводчик считает, что мое объяснение переводится как

Asumiendo que esto es realmente una base de datos Oracle, нет SQL Server,no hay ningún objeto inserttado, las variable no tienen el prefijo @ y hay un nuevo pseudo-registro.Дебе, особенно если оно является активным и активным по отношению к учебному заведению (не обязательно, чтобы оно действовало в обязательном порядке).Заявление о внесении вклада нет.Aunque no es estrictamente necesario, cada insertción debe enumerator explícitamente las columnas en las que está inserttando.В противоположность этому, опишите и расскажите о том, что вам нужно, чтобы сделать это в полном объеме, а также в соответствии со своей новой редакцией.Вы можете объявить о том, что все в порядке с пункцией и комой.

Доступ к запросам algo como

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