Есть ли способ "замедлить" триггеров?

lRaulMN спросил: 07 октября 2018 в 11:57 в: sql

Я работаю с PL / SQL в Oracle SQL Developer 3.2.2, использую Oracle Database 11g Express Edition.

До сих пор я создал несколько таблиц: Population and Sectors.

CREATE TABLE sectores (
  codS NUMBER(2),
  nombreS VARCHAR2(20),
  porcentS NUMBER(5,2),
  ingresosS NUMBER(9,2),
  num_pob NUMBER(3),
  PRIMARY KEY (codS)
);CREATE TABLE poblacion (
  dni VARCHAR2(9), 
  nombre VARCHAR(12), 
  apellido1 VARCHAR2(12), 
  apellido2 VARCHAR2(12),
  fechanac DATE,
  direccion VARCHAR2(20),
  cp VARCHAR2(5),
  sexo VARCHAR2(1),
  ingresos NUMBER(7,2),
  gastosFijos NUMBER(7,2), 
  gastosAlim NUMBER(7,2), 
  gastosRopa NUMBER(7,2), 
  sector NUMBER(2), 
  PRIMARY KEY (dni),
  FOREIGN KEY (sector) REFERENCES sectores (codS) ON DELETE SET NULL
);

Таким образом, люди из "Population" будут каким-то образом связаны с секторами. Я намерен уничтожить любой момент У меня более 3 человек в одном и том же секторе.

Каждый раз, когда я добавляю нового человека в группу "Население", я увеличиваю num_pob из секторов на 1. Я делаю это с помощью этого TRIGGER:

CREATE OR REPLACE TRIGGER ingresosS1 
AFTER INSERT ON poblacion 
REFERENCING NEW AS NUEVA
FOR EACH ROW
WHEN (NUEVA.sector IS NOT NULL) 
BEGIN
  UPDATE sectores
  SET ingresosS = ingresosS + :NUEVA.ingresos
  WHERE codS = :NUEVA.sector;  UPDATE sectores
  SET num_pob = 1 + (SELECT num_pob FROM sectores WHERE codS = :NUEVA.sector)
  WHERE codS = :NUEVA.sector;  UPDATE sectores 
  SET porcentS = 100 * ingresosS / (SELECT SUM(ingresosS) FROM sectores);
END;
/

Я проверил это до сих пор, и все работает нормально. Теперь я объявляю этот TRIGGER:

CREATE OR REPLACE TRIGGER muchaGente
AFTER INSERT OR UPDATE ON sectores
FOR EACH ROW
WHEN (NEW.codS IS NOT NULL)
DECLARE 
    counter INTEGER;
    numPOB INTEGER;
BEGIN
  counter := :OLD.num_pob;
    numPOB := counter - 1;
    IF 3 < counter
        THEN 
        DBMS_OUTPUT.ENABLE;
        DBMS_OUTPUT.PUT_LINE('');
        DBMS_OUTPUT.PUT_LINE('Trigger muchaGente: Hay más de 3 personas en el sector:' || :NEW.codS );
        DBMS_OUTPUT.PUT_LINE('Trigger muchaGente: Antes había:' || numPOB ||', ahora:' || :OLD.num_pob );
        DBMS_OUTPUT.PUT_LINE('');
    END IF;
END;
/

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

Триггер muchaGente: Сено 3 человека в секторе: 1

Триггер muchaGente: Antes había: 3, ahora: 4

Однако, здесь возникает проблема ... После удаления таблиц и их повторного создания, когда я вставляю 5 человек, я получаю это в журнале:

Триггер muchaGente: сено 3 человека в секторе: 1

Триггер muchaGente: Antes había: 3, ахора: 4

Триггер moreaGente: Сено 3 человека en эль сектор: 1

триггер muchaGente: Antes había: 3, ахора: 4

триггер muchaGente: сено 3 человека в секторе: 1

триггер muchaGente: Antes había: 3, ахора: 4

Триггер muchaGente: сено 3 человека в секторе: 1

Триггер muchaGente: Antes había: 4, ахора: 5

Это имеет смысл 0. Я думаю, что каким-то образом триггеры достаточно быстры, чтобы испортить журналы на моем экране. Ребята, вы все равно знаете, как это исправить? Может быть, последний TRIGGER имеет ошибку, но я не вижу ...


0 ответов