2016-08-19 4 views
0

Я хочу переопределить сообщение, генерирующее ошибку (ORA-02292). Это сообщение как тотриггер, чтобы отменить сообщение до ошибки (ORA-02292)

ORA-02292: integrity constraint (IVANKA.FK_SUPPLIER) violated - child record found 

Я хочу триггер, чтобы отменить вышеуказанное сообщение на его примере на этом (МОЕ переопределение :))

я попытался сделать, как этот

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

CREATE TABLE supplier 
(supplier_id numeric(10) not null, 
    supplier_name varchar2(50) not null, 
    contact_name varchar2(50), 
    CONSTRAINT supplier_pk PRIMARY KEY (supplier_id) 
); 

CREATE TABLE products 
(product_id numeric(10) not null, 
    supplier_id numeric(10) not null, 
    CONSTRAINT fk_supplier 
    FOREIGN KEY (supplier_id) 
    REFERENCES supplier (supplier_id) 
); 

затем вставить данные

INSERT INTO supplier 
(supplier_id, supplier_name, contact_name) 
VALUES (1000, 'Microsoft', 'Bill Gates'); 

INSERT INTO products 
(product_id, supplier_id) 
VALUES (50000, 1000); 

то не вызывают

create or replace trigger sup_z 
after delete on supplier 
for each row 
declare 
v_error_constraint exception; 
    pragma exception_init(v_error_constraint, -2292); 
begin 
    null; 
exception 
     When v_error_constraint then 
     raise_application_error(-20001, 
     'My ovvervide:)'); 
End; 

то не удалить, чтобы сгенерировать сообщение

DELETE from supplier 
WHERE supplier_id = 1000 

, но я не вижу мое сообщение в триггере я вижу

ORA-02292: integrity constraint (IVANKA.FK_SUPPLIER) violated - child record found 

Можете ли вы мне помочь? Что я делаю не так?

+1

Нарушение ограничения прекращается до срабатывания триггера. –

+0

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

+0

Я знал, как решить ошибку с ограничением, но мне нужно только напечатать другое сообщение – VasyPupkin

ответ

0

Проверить this из (дисплей пользовательское сообщение, когда ограничение нарушается PL/SQL). Я думаю, вы хотите что-то подобное.

+0

Мне нравится, когда вы создаете или заменяете триггер sup_z перед удалением по поставщику для каждой строки declare v4error_constraint исключение; pragma exception_init (v_error_constraint, -2292); начало null; Исключение Когда v_error_constraint, то raise_application_error (-20001, «Мой ovvervide :)»); Конец; (но после этого триггера i dot см. сообщение, что я хочу), может помочь? – VasyPupkin

3

Ваш триггер срабатывает после того, как было выполнено DELETE, поэтому оно не срабатывает, если ошибка DELETE. Вы можете использовать триггер BEFORE, чтобы избежать DELETE, если вы найдете некоторые дочерние записи; например:

create or replace trigger sup_z 
before delete on supplier 
for each row 
declare 
    vNumberOfChild number; 
begin 
    select count(1) 
    into vNumberOfChild 
    from products 
    where supplier_id = :old.supplier_id; 
    -- 
    if vNumberOfChild > 0 then 
     raise_application_error(-20001, 'My ovveride:)'); 
    end if; 
End; 

Другим способом может быть определяющим процедуру для обработки удаления:

SQL> create or replace procedure deleteSupplier(p_id in numeric) is 
    2 vNumberOfChild number; 
    3 begin 
    4  select count(1) 
    5  into vNumberOfChild 
    6  from products 
    7  where supplier_id = p_id; 
    8  -- 
    9  if vNumberOfChild > 0 then 
10   dbms_output.put_line('My ovveride'); 
11  else 
12   delete supplier 
13   where supplier_id = p_id; 
14  end if; 
15 end; 
16/

Procedure created. 

SQL> set serveroutput on 
SQL> exec deleteSupplier(1000); 
My ovveride 

PL/SQL procedure successfully completed. 

Это позволяет избежать запуска delete перед проверкой данных, так что вам не нужны триггеры.

+0

если я использую ваш вариант триггера. я вижу messeges ORA-20001: Мой ovveride :) ORA-06512: на странице «IVANKA.SUP_Z», строка 10 ORA-04088: ошибка во время запуска триггера «IVANKA.SUP_Z» 1. удалить из поставщика где поставщик_id = 1 (как видно только мой messege?) – VasyPupkin

+0

Что вы видите, это стек ошибок; Я только что отредактировал, чтобы показать другой способ, который вы могли бы использовать, но это зависит от того, как вы хотите называть свое удаление – Aleksej

+0

, но я не уверен, как добавить вашу процедуру в триггер? – VasyPupkin

0

Когда все, что вам нужно, это просто сообщение для печати, почему нам нужен триггер в первую очередь? Разве мы не должны справляться с этим только с одним исключением?

declare 
    v_error_constraint exception; 
    pragma exception_init(v_error_constraint, -2292); 
begin 
    DELETE from supplier 
    WHERE supplier_id = 1000; 
exception 
     When v_error_constraint then 
     raise_application_error(-20001, 
     'My ovvervide:)'); 
End;