2009-08-24 3 views
2

может кто-нибудь помочь мне написать триггер, чтобы запретить конкретную запись в таблицу (например, location = 'chicago' не разрешено). Схема таблицы выглядит следующим образом (deptno, deptname, location). Я использую оракул 10g.до INSERT или Update trigger plsql

+1

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

ответ

11

Вы можете легко сделать то, что хотите, с помощью CHECK CONSTRAINT на своей колонке.

ALTER TABLE T 
ADD CONSTRAINT constraint_name CHECK (location <> 'chicago') [DISABLE]; 

ВЫКЛЮЧИТЬ необязательное ключевое слово. Если вы создаете контрольное ограничение, используя ключевое слово DISABLE, будет создано ограничение , , но условие не будет исполнено.

Constraint Штаты

  • ВКЛЮЧИТЬ - обеспечить, чтобы все входящие данные соответствуют ограничению
  • DISABLE - разрешить входящие данные, независимо от того, соответствует ли она ограничения
  • VALIDATE - убедитесь, что существующие данные соответствуют con straint
  • NOVALIDATE - существующие данные не должны соответствовать ограничению

Они могут быть использованы в комбинации

ВКЛЮЧИТЬ {[по умолчанию] VALIDATE | NOVALIDATE}

DISABLE {VALIDATE | [по умолчанию] NOVALIDATE}

  • ВКЛЮЧИТЬ VALIDATE такое же, как ВКЛЮЧИТЬ.

  • ENABLE NOVALIDATE означает, что ограничение проверено, но оно не обязательно должно быть истинным для всех строк. это возобновит проверку ограничений на отключенных ограничениях без предварительной проверки всех данных в таблице.

  • DISABLE NOVALIDATE - это то же самое, что и DISABLE.

  • DISABLE VALIDATE отключает ограничение, снижает индекс ограничения и запрещает любую модификацию ограниченных столбцов. для ограничения UNIQUE, это позволяет загружать данные из нераспределенной таблицы в секционированную таблицу, используя предложение ALTER TABLE .. EXCHANGE PARTITION.

Ниже приведен пример триггера ДО НАЧАЛА ВСТАВКИ. Однако лучше создать ограничения на вашу схему или выполнить CUSTOM_INSERT PROCEDURE, чтобы отфильтровать ее. Here - хорошая статья о Целостность данных - ограничения и триггеры.

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

Пример триггера (считают это плохая идея для фильтрации входных данных):

CREATE TRIGGER myTrigger 
BEFORE INSERT 
ON table 
REFERENCING NEW AS New 
FOR EACH ROW 
    BEGIN 
    IF (New.location = 'chicago') THEN 
     RAISE cError;  
EXCEPTION 
WHEN cError THEN 
     RAISE_APPLICATION_EXCEPTION(-20001,'Chicago is not allowed'); 
END; 
+0

Вместо DELETE должен быть RAISE_APPLICATION_ERROR (-20000, «Нет, Чикаго, пожалуйста!»); – jva

+0

Вся триггерная вещь вообще не нужна. И на моем примере (плохой) триггер после ... –

+1

Недостатком триггера является то, что вам придется сбой инструкции. С ограничением проверки разработчик имеет возможность использовать предложение LOG ERRORS, чтобы вставлять достоверные данные и вносить недопустимые данные в таблицу исключений. Очень полезен для массовых нагрузок данных. –