2013-04-14 2 views
0

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

Таблица A содержит строки, которые я хотел бы сделать недоступными для редактирования, если значение даты в таблице B старше, чем sysdate.

мне нужно как-то сказать на курок, чтобы проверить строку и использовать внешний ключ в строке Таблица А для запроса его соответствующие строки в таблице B, а затем сделать это:

raise_application_error (-20000, «Это слишком поздно, чтобы изменить эту запись ');

Спасибо

ответ

0

Предполагая, что это домашнее задание, вы хотите что-то вроде этого (я предполагаю, что в структурах таблиц и кардинальностях, так как вы не указали).

CREATE OR REPLACE TRIGGER trigger_name 
    AFTER UPDATE ON a 
    FOR EACH ROW 
DECLARE 
    l_dt_b b.dt_col%type; 
BEGIN 
    SELECT dt_col 
    INTO l_dt_b 
    FROM b 
    WHERE b.b_key = :new.b_key; 

    IF(l_dt_b < sysdate) 
    THEN 
    RAISE_APPLICATION_ERROR(-20001, 'Too late'); 
    END IF; 
END; 

Если это действительно для реальной системы, то проверка на основе триггеров является проблематичной. Например, это небезопасно в многопользовательской системе. В сеансе 1 я, возможно, изменил строку в B, но еще не внес изменения. Затем вы можете запросить строку в сеансе 2, увидеть старое значение и разрешить UPDATE. Мы можем зафиксировать наши изменения, и ничто не обнаружит, что у нас есть данные в недопустимом состоянии.

+0

Благодарим вас за ответ! я получаю эти ошибки, когда я проверить триггер ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк ORA-06512: на "[DBO] .TRG_CHECK_DATE", строка 4 ORA-04088: ошибка во время выполнения из триггера [dbo] .TRG_CHECK_DATE ' Мне также нужно взять: new от: new.b_key, поскольку он говорит мне, что я использую неверную переменную связывания – user2241161

+0

@ user2241161 - Как я уже сказал, я предполагаю, что кардинальность. Если 'B' является родителем в отношении внешнего ключа, то новая строка в' A' должна указывать ровно на 1 строку в 'B'. Полученная ошибка указывает на то, что запрос возвращает более одной строки. Это означает, что вы не перевели его в свою модель данных правильно или что ваша модель данных фактически не имеет надлежащего отношения с внешним ключом, и в 'B' есть несколько родительских строк, которые относятся к новой строке в' A'. ': new.b_key' относится к столбцу' b_key' в новой строке, которую вы вставляете в таблицу 'A'. –

+0

@ user2241161 - Если вы получаете ошибку «плохой переменной привязки», это, вероятно, означает, что вы указали имя столбца в 'A', которое неправильно ссылается на' B'. Я предполагал, что столбец будет назван одинаковым как в «A», так и «B». Возможно, что ваша модель данных не соответствует этому. –