Что за программа триггер

Содержание

Приложение не совместимо с продуктами TRIGGER SIX SHOOTER, 4 PLUS, ONE или VOLT. Ищите «TRIGGER ACS PLUS», если вы являетесь владельцем одного из этих устройств.

Беспроводной контроллер аксессуаров Trigger существенно экономит время установки ваших электронных аксессуаров! Устраните необходимость прокладывать провода под приборной панелью или через брандмауэр автомобиля при подключении аксессуаров.

Наше приложение Bluetooth будет управлять функциями включения / выключения и затемнения, а также мигать при использовании светодиодного или обычного освещения. Он прост в настройке и позволяет настраивать пользователя. Используйте приложение, чтобы «зажигать» огни снаружи автомобиля всякий раз, когда вам может понадобиться активировать аксессуар по требованию.

В дополнение к приложению Trigger включает в себя радиочастотный пульт дистанционного управления для активации установленных аксессуаров снаружи автомобиля и функции диммирования / мигания для установленного освещения. Кроме того, плавкие цепи со светодиодными индикаторами уведомляют вас о перегоревших предохранителях.

ЧТО ТАКОЕ ТРИГГЕР В ЭЛЕКТРОНИКЕ И НЕ ТОЛЬКО

Инструкции по настройке приложения:

1. Убедитесь, что Bluetooth активен на вашем мобильном устройстве, и Trigger включен.
2. На устройстве в настройках Bluetooth найдите «Trigger» или «Run-D» в качестве имени устройства.
3. Подключите мобильное устройство к контроллеру триггера, используя код сопряжения «1234».
4. Запустите приложение, коснитесь значка «Сканировать» в нижней части экрана. Через несколько секунд приложение подключится к триггерному контроллеру. Теперь будут активны функции Power, Strobe и Dimming.
5. Нажмите значок «Настройки», чтобы настроить имена принадлежностей, подключенных к Trigger. Нажмите «Сохранить», чтобы сохранить настроенные имена.
6. Нажмите «Домой», чтобы вернуться на главный экран приложения.

Источник: play.google.com

PostgreSQL-триггеры: создание, удаление, примеры

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

Триггер должен быть связан с указанной таблицей, представлением (псевдотаблицей) или внешней таблицей. Он запускает свою часть кода только при выполнении операций с этой сущностью — INSERT, UPDATE, DELETE или TRUNCATE. В зависимости от требований мы можем запускать триггер до, после или вместо события/операции.

Типы триггеров

Триггеры делятся на два типа в зависимости от того, на каком уровне они действуют.

Если триггер помечен опцией FOR EACH ROW, тогда функция вызывается для каждой строки, которая изменяется в результате события. Например, если сделать UPDATE для 100 строк, триггерная функция UPDATE будет вызываться 100 раз, по одному разу для каждой обновлённой строки.

Опция FOR EACH STATEMENT вызовет функцию только один раз для каждого оператора, независимо от количества изменяемых строк.

Использование триггеров

Это довольно мощный инструмент, у которого много сценариев использования. Вот лишь несколько примеров:

  1. Вы можете использовать триггерные конструкции для отслеживания транзакций таблицы, регистрируя сведения о событии.
  2. Вы можете создать триггер, с помощью которого будете проверять ограничения перед применением транзакции.
  3. С помощью таких спусковых крючков вы можете автоматически заполнять поля, используя записи новых транзакций.

Триггеры помогают оптимизировать количество запросов. Например, у вас на сервере Timeweb Cloud есть таблица, в которую записываются временные метки. Задача — агрегировать данные за указанные интервалы (пусть их будет четыре в сутки, каждый продолжительностью 6 часов).

Если каждый раз сканировать таблицу, выполнять группировку, сортировку и все расчёты (допустим, вычисление среднего значения), то на больших данных быстро станет заметной неэффективность работы — не помогут даже мощные облачные серверы .

Чтобы не обрабатывать все данные каждый раз заново, можно использовать Materialized Views — это представления, которые сохраняют результаты в табличной форме. Они позволяют закэшировать данные. Проблема в том, что при каждом обновлении представление пересчитывается целиком. На больших данных это снова может стать проблемой.

Здесь на помощь и приходит триггер. Он позволяет создать по сути тот же Materialized View, только умный. Он не пересчитывает все данные, а обновляет только ту строку, в которую внесли изменения.

Создание триггера

С практической пользой от использования разобрались. Теперь посмотрим, как создать триггер в PostgreSQL.

Синтаксис запроса следующий:

CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name < BEFORE | AFTER | INSTEAD OF >< event [ OR . ] >
ON table_name
[ FROM referenced_table_name ]
[ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
[ REFERENCING < < OLD | NEW >TABLE [ AS ] transition_relation_name > [ . ] ]
[ FOR [ EACH ] < ROW | STATEMENT >]
[ WHEN ( condition ) ]
EXECUTE < FUNCTION | PROCEDURE >function_name ( arguments )

где событие (event) может быть одним из следующих:

INSERT
UPDATE [ OF column_name [, . ] ]
DELETE
TRUNCATE

Здесь требуется несколько пояснений.

  1. Вы можете создать (CREATE) или заменить (REPLACE) уже существующий триггер.
  2. Вы сразу связываете функцию с конкретной таблицей, представлением или внешней таблицей. Код будет исполняться только при наступлении события с этой связанной сущностью.
  3. Триггеры с опцией INSTEAD OF должны быть помечены опцией FOR EACH ROW и могут быть определены только в представлениях. Триггеры, которые выполняются до (BEFORE) или после события (AFTER) в представлении должны быть помечены как FOR EACH STATEMENT. В документации есть таблица, которая поможет сориентироваться.
Читайте также:
Самсунг хелс что это за программа

Простые примеры

Чтобы разобраться с синтаксисом, посмотрим на примеры триггеров PostgreSQL.

Например, здесь вы говорите движку, что нужно выполнять функцию check_account_update() каждый раз до обновления таблицы accounts:

CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
EXECUTE FUNCTION check_account_update();

В этом примере вы устанавливаете дополнительное условие. Функция должна выполняться только в том случае, если обновляется столбец balance в таблице accounts.

CREATE OR REPLACE TRIGGER check_update
BEFORE UPDATE OF balance ON accounts
FOR EACH ROW
EXECUTE FUNCTION check_account_update();

А это триггер для добавления записей в журнал. Функция срабатывает только после того, как в таблицу accounts внесли изменения:

CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE FUNCTION log_account_update();

Ещё один пример — с INSTEAD OF. Функция view_insert_row() выполняется для каждой строки, чтобы вставить строки в таблицы, лежащие в основе представления:

CREATE TRIGGER view_insert
INSTEAD OF INSERT ON my_view
FOR EACH ROW
EXECUTE FUNCTION view_insert_row();

Триггер на удаление в PostgreSQL можно добавить к транзакциям, удаляющим записи:

CREATE TRIGGER example_delete_trigger
AFTER DELETE ON my_view
FOR EACH ROW
EXECUTE PROCEDURE aft_delete();

Практика — добавление информации в две таблицы

Давайте рассмотрим пример создания триггера PostgreSQL , который будет добавлять в таблицу информацию о новом сотруднике, если эти данные появились в другой таблице.

Сначала нужно создать обе таблицы:

CREATE TABLE «Employee»
(
«EmployeeId» INT NOT NULL,
«LastName» VARCHAR(20) NOT NULL,
«FirstName» VARCHAR(20) NOT NULL,
«Title» VARCHAR(30),
«ReportsTo» INT,
«BirthDate» TIMESTAMP,
«HireDate» TIMESTAMP,
«Address» VARCHAR(70),
«City» VARCHAR(40),
«State» VARCHAR(40),
«Country» VARCHAR(40),
«PostalCode» VARCHAR(10),
«Phone» VARCHAR(24),
«Fax» VARCHAR(24),
«Email» VARCHAR(60),
CONSTRAINT «PK_Employee» PRIMARY KEY («EmployeeId»)
);

CREATE TABLE «Employee_Audit»
(
«EmployeeId» INT NOT NULL,
«LastName» VARCHAR(20) NOT NULL,
«FirstName» VARCHAR(20) NOT NULL,
«UserName» VARCHAR(20) NOT NULL,
«EmpAdditionTime» VARCHAR(20) NOT NULL,
);

Таблицы готовы, теперь нужно добавить триггерную функцию, чтобы настроить между ними обмен данными по наступлению события. В нашем случае событие — это добавление информации о новом сотруднике в таблицу «Employee».

CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc()
RETURNS trigger AS
$$
BEGIN
INSERT INTO «Employee_Audit» ( «EmployeeId», «LastName», «FirstName»,»UserName» ,»EmpAdditionTime»)
VALUES(NEW.»EmployeeId»,NEW.»LastName»,NEW.»FirstName»,current_user,current_date);
RETURN NEW;
END;
$$
LANGUAGE ‘plpgsql’;
CREATE TRIGGER employee_insert_trigger
AFTER INSERT
ON «Employee»
FOR EACH ROW
EXECUTE PROCEDURE employee_insert_trigger_fnc();

Как только мы выполним описанный выше INSERT в «Employee», триггер добавит одну новую запись в «Employee_Audit» со следующими данными:

Теперь проверим, что всё работает так, как мы предполагали. Сначала выведем сведения о сотруднике из таблицы «Employee», в которую мы только что вставили данные:

Теперь посмотрим, записались ли нужные данные в таблицу «Employee_Audit»:

SELECT * FROM «Employee_Audit» ;
EmployeeId | 12
LastName | Smith
FirstName | Jeff
UserName | postgres
EmpAdditionTime | 2022-06-17

Отлично, всё работает!

Изменение триггера

Чтобы изменить свойства триггера, используйте CREATE OR REPLACE TRIGGER, указав имя существующей триггерной функции и связанную таблицу. Остальные свойства вы можете менять так, как нужно для выполнения вашей задачи.

Вы также можете переименовать триггер. Для этого используйте запрос ALTER TRIGGER:

ALTER TRIGGER name ON table_name RENAME TO new_name

Удаление триггера

Используйте DROP TRIGGER, чтобы удалить триггер PostgreSQL . Синтаксис очень простой:

DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]

Например, так вы удалите some_example_of_trigger, связанный с таблицей Example:

DROP TRIGGER some_example_of_trigger ON «Example» ;

Для возможности удаления триггера пользователь должен быть владельцем таблицы.

Можно использовать дополнительные параметры при отключении:

  • IF EXISTS — указание на то, что не надо выдавать ошибку, если такого триггера нет.
  • CASCADE — автоматически удалять все объекты, которые зависят от триггера, объекты, которые зависят от этих объектов, и так далее.
  • RESTRICT — не удалять триггер, если от него зависят другие объекты. Это значение по умолчанию.

Важные моменты, которые следует помнить

  1. Чтобы создать триггер, пользователь должен иметь привилегию TRIGGER для таблицы и привилегию EXECUTE для функции.
  2. Вы можете проверить системный каталог «pg_trigger» на наличие существующей информации о триггерах в базе данных.
  3. Если вы создадите несколько триггеров для одного и того же объекта и для одного и того же события, они будут срабатывать в алфавитном порядке по имени.

В своем официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.

Источник: timeweb.cloud

Общие сведения о триггерах

где plsql_trigger_source, это такая конструкция:

Конструкции simple_dml_trigger, instead_of_dml_trigger, compound_dml_trigger и system_trigger будут приведены в соответствующих разделах статьи.

DML triggers

  • DML триггеры создаются для таблиц или представлений, срабатывают при вставке, обновлении или удалении записей.
  • Триггер может быть создан в другой схеме, отличной от той, где определена таблицы. В таком случае текущей схемой при выполнении триггера считается схема самого триггера.
  • При операции MERGE срабатывают триггеры на изменение, вставку или удаление записей в зависимости от операции со строкой.
  • Триггер – часть транзакции, ошибка в триггере откатывает операцию, изменения таблиц в триггере становятся частью транзакции.
  • Если откатывается транзакция, изменения триггера тоже откатываются.
  • В триггерах запрещены операторы DDL и управления транзакциями (исключения – автономные транзакции).

Конструкция simple_dml_trigger:

Где, dml_event_clause:

referencing_clause:

trigger_edition_clause:

trigger_body:

  • На таблице
  • На представлении (instead of trigger)
  • Вставка записей (insert)
  • Обновление записей (update)
  • Удаление записей (delete)
  • Уровень всей команды (statement level triggers)
  • Уровень записи (row level triggers)
  • Составные триггеры (compound triggers)
  • Перед выполнением операции (before)
  • После выполнения операции (after)
Читайте также:
Съемка Самсунг что это за программа

Crossedition triggers — служат для межредакционного взаимодействия, например для переноса и трансформации данных из полей, отсутствующих в новой редакции, в другие поля.

Условные предикаты для определения операции, на которую сработал триггер:

Предикат Описание
Inserting True, если триггер сработал на операцию Insert
Updating True, если триггер сработал на операцию Update
Updating(‘colum’) True, если триггер сработал на операцию Update, которая затрагивает определенное поле
Deleting True, если триггер сработал на операцию Delete

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

Пример

CREATE OR REPLACE TRIGGER t BEFORE INSERT OR UPDATE OF salary, department_id OR DELETE ON employees BEGIN CASE WHEN INSERTING THEN DBMS_OUTPUT.PUT_LINE(‘Inserting’); WHEN UPDATING(‘salary’) THEN DBMS_OUTPUT.PUT_LINE(‘Updating salary’); WHEN UPDATING(‘department_id’) THEN DBMS_OUTPUT.PUT_LINE(‘Updating department ID’); WHEN DELETING THEN DBMS_OUTPUT.PUT_LINE(‘Deleting’); END CASE; END;

Псевдозаписи

Существуют псевдозаписи, позволяющие обратиться к полям изменяемой записи и получить значения полей до изменения и значения полей после изменения. Это записи old и new. С помощью конструкции Referencing можно изменить их имена. Структура этих записей tablename%rowtype. Эти записи есть только у триггеров row level или у compound триггеров (с секциями уровня записи).

Операция срабатывания триггера OLD.column NEW.column
Insert Null Новое значение
Update Старое значение Новое значение
Delete Старое значение Null
  • С псевдозаписями запрещены операции уровня всей записи ( :new = null;)
  • Нельзя изменять значения полей записи old
  • Если триггер срабатывает на delete, нельзя изменить значения полей записи new
  • В триггере after нельзя изменить значения полей записи new

Instead of dml triggers

  • Создаются для представлений (view) и служат для замещения DML операций своим функционалом.
  • Позволяют производить операции вставки/обновления или удаления для необновляемых представлений.

Конструкция instead_of_dml_trigger:

  • Это всегда триггер уровня записи (row level)
  • Имеет доступ к псевдозаписям old и new, но не может изменять их
  • Заменяет собой dml операцию с представлением (view)

Пример

CREATE OR REPLACE VIEW order_info AS SELECT c.customer_id, c.cust_last_name, c.cust_first_name, o.order_id, o.order_date, o.order_status FROM customers c, orders o WHERE c.customer_id = o.customer_id; CREATE OR REPLACE TRIGGER order_info_insert INSTEAD OF INSERT ON order_info DECLARE duplicate_info EXCEPTION; PRAGMA EXCEPTION_INIT (duplicate_info, -00001); BEGIN INSERT INTO customers (customer_id, cust_last_name, cust_first_name) VALUES ( :new.customer_id, :new.cust_last_name, :new.cust_first_name); INSERT INTO orders (order_id, order_date, customer_id) VALUES ( :new.order_id, :new.order_date, :new.customer_id); EXCEPTION WHEN duplicate_info THEN RAISE_APPLICATION_ERROR ( num=> -20107, msg=> ‘Duplicate customer or order ID’); END order_info_insert;

Instead of triggers on Nested Table Columns of Views

Можно создать триггер для вложенной в представлении таблицы. В таком триггере также присутствует дополнительная псевдозапись – parent, которая ссылается на всю запись представления (стандартные псевдозаписи old и new ссылаются только на записи вложенной таблицы)

Пример такого триггера
Запускает триггер оператор insert

INSERT INTO TABLE ( SELECT d.emplist FROM dept_view d WHERE department_id = 10 ) VALUES (1001, ‘Glenn’, ‘AC_MGR’, 10000);

Составные DML триггера (compound DML triggers)

Появившиеся в версии 11G эти триггера включают в одном блоке обработку всех видов DML триггеров.
Конструкция compound_dml_trigger:

Где, compound_trigger_block:

timing_point_section:

timing_point:

tps_body:

  • Срабатывают такие триггера при разных событиях и в разные моменты времени (на уровне оператора или строки, при вставке/обновлении/удалении, до или после события).
  • Не могут быть автономными транзакциями.
  • Собирать в коллекцию строки для вставки в другую таблицу, чтобы периодически вставлять их пачкой
  • Избежать ошибки мутирующей таблицы (mutating-table error)

Структура составного триггера

  • Before statement
  • After statement
  • Before each row
  • After each row
  • Нельзя обращаться к псевдозаписям old, new или parent в секциях уровня выражения (before statement и after statement)
  • Изменять значения полей псевдозаписи new можно только в секции before each row
  • Исключения, сгенерированные в одной секции, нельзя обрабатывать в другой секции
  • Если используется оператор goto, он должен указывать на код в той же секции

Пример

create or replace trigger tr_table_test_compound for update or delete or insert on table_test compound trigger v_count pls_integer := 0; before statement is begin dbms_output.put_line ( ‘before statement’ ); end before statement; before each row is begin dbms_output.put_line ( ‘before insert’ ); end before each row; after each row is begin dbms_output.put_line ( ‘after insert’ ); v_count := v_count + 1; end after each row; after statement is begin dbms_output.put_line ( ‘after statement’ ); end after statement; end tr_table_test_compound;

Основные правила определения DML триггеров

  • Update of – позволяет указать список изменяемых полей для запуска триггера
  • Все условия в заголовке и When … проверяются без запуска триггера на стадии выполнения SQL
  • В операторе When можно использовать только встроенные функции
  • Можно делать несколько триггеров одного вида, порядок выполнения не определен по умолчанию, но его можно задать с помощью конструкции FOLLOWS TRIGGER_FIRST
  • Ограничения уникальности проверяются при изменении записи, то есть после выполнения триггеров before
  • Секция объявления переменных определяется словом DECLARE
  • Основной блок триггера подчиняется тем же правилам, что и обычные PL/SQL блоки

Ограничения DML триггеров

  • нельзя выполнять DDL statements (только в автономной транзакции)
  • нельзя запускать подпрограммы с операторами контроля транзакций
  • не имеет доступа к SERIALLY_REUSABLE пакетов
  • размер не может превышать 32К
  • нельзя декларировать переменные типа LONG и LONG RAW

Ошибка мутирования таблицы ORA-04091

  • использовать триггеры уровня операции
  • автономная транзакция в триггере
  • использовать сторонние структуры (коллекции уровня пакета)
  • использовать COMPOUND TRIGGER
  • изменение самого алгоритма с выносом функционала из триггера

Системные триггеры (System triggers)

Конструкция system_trigger:

Такие триггеры относятся или к схеме, или ко всей базе данных.

  • До того, как будет выполнена операция (на которую срабатывает триггер)
  • После того, как будет выполнена операция (на которую срабатывает триггер)
  • Вместо выполнения оператора Create
Читайте также:
Vegas movie studio что это за программа

Триггеры уровня схемы (schema triggers)

  • Срабатывает всегда, когда пользователь-владелец схемы запускает событие (выполняет операцию), на которую должен срабатывать триггер.
  • В случае, если любой другой пользователь запускает процедуру/функцию, которая вызывается с правами создателя, и в этой процедуре/функции выполняется операция, на которую создан системный триггер – этот триггер сработает.

Пример триггера

CREATE OR REPLACE TRIGGER drop_trigger BEFORE DROP ON hr.SCHEMA BEGIN RAISE_APPLICATION_ERROR ( num => -20000, msg => ‘Cannot drop object’); END;

Триггеры уровня базы данных (database triggers)

  • Такой триггер срабатывает когда любой пользователь БД выполняет команду, на которую создан триггер.

Пример триггера
CREATE OR REPLACE TRIGGER check_user AFTER LOGON ON DATABASE BEGIN check_user; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR (-20000, ‘Unexpected error: ‘|| DBMS_Utility.Format_Error_Stack); END;

Instead of create triggers

  • Это триггер уровня схемы, который срабатывает на команду create и заменяет собой эту команду (т.е. вместо выполнения команды create выполняется тело триггера).

Пример триггера
CREATE OR REPLACE TRIGGER t INSTEAD OF CREATE ON SCHEMA BEGIN EXECUTE IMMEDIATE ‘CREATE TABLE T (n NUMBER, m NUMBER)’; END;

Атрибуты системных триггеров

IF (ora_sysevent = ‘LOGON’) THEN v_addr := ora_client_ip_address; END IF;
v_db_name := ora_database_name;
IF (ora_dict_obj_type = ‘USER’) THEN INSERT INTO event_table VALUES (ora_des_encrypted_password); END IF;
INSERT INTO event_table VALUES (‘Changed object is ‘ || ora_dict_obj_name);
IF (ora_sysevent=’ASSOCIATE STATISTICS’) THEN number_modified := ora_dict_obj_name_list(name_list); END IF;
INSERT INTO event_table VALUES (‘object owner is’ || ora_dict_obj_owner);
IF (ora_sysevent=’ASSOCIATE STATISTICS’) THEN number_modified := ora_dict_obj_name_list(owner_list); END IF;
INSERT INTO event_table VALUES (‘This object is a ‘ || ora_dict_obj_type);
IF (ora_sysevent = ‘GRANT’) THEN number_of_grantees := ora_grantee(user_list); END IF;
IF (ora_instance_num = 1) THEN INSERT INTO event_table VALUES (‘1’); END IF;
IF (ora_sysevent = ‘ALTER’ AND ora_dict_obj_type = ‘TABLE’) THEN alter_column := ora_is_alter_column(‘C’); END IF;
IF (ora_sysevent = ‘CREATE’ AND ora_dict_obj_type = ‘TABLE’ AND ora_is_creating_nested_table) THEN INSERT INTO event_table VALUES (‘A nested table is created’); END IF;
IF (ora_sysevent = ‘ALTER’ AND ora_dict_obj_type = ‘TABLE’) THEN drop_column := ora_is_drop_column(‘C’); END IF;
IF ora_is_servererror(error_number) THEN INSERT INTO event_table VALUES (‘Server error!!’); END IF;
SELECT ora_login_user FROM DUAL;
— Retrieve ora_sql_txt into sql_text variable v_n := ora_partition_pos; v_new_stmt := SUBSTR(sql_text,1,v_n — 1) || ‘ ‘ || my_partition_clause || ‘ ‘ || SUBSTR(sql_text, v_n));
IF (ora_sysevent = ‘GRANT’ OR ora_sysevent = ‘REVOKE’) THEN number_of_privileges := ora_privilege_list(privilege_list); END IF;
IF (ora_sysevent = ‘REVOKE’) THEN number_of_users := ora_revokee(user_list); END IF;
INSERT INTO event_table VALUES (‘top stack error ‘ || ora_server_error(1));
n := ora_server_error_depth; — Use n with functions such as ora_server_error
INSERT INTO event_table VALUES (‘top stack error message’ || ora_server_error_msg(1));
n := ora_server_error_num_params(1);
— Second %s in «Expected %s, found %s»: param := ora_server_error_param(1,2);
CREATE TABLE event_table (col VARCHAR2(2030)); DECLARE sql_text ora_name_list_t; n PLS_INTEGER; v_stmt VARCHAR2(2000); BEGIN n := ora_sql_txt(sql_text); FOR i IN 1..n LOOP v_stmt := v_stmt || sql_text(i); END LOOP; INSERT INTO event_table VALUES (‘text of triggering statement: ‘ || v_stmt); END;
INSERT INTO event_table VALUES (ora_sysevent);
IF (ora_sysevent = ‘GRANT’ AND ora_with_grant_option = TRUE) THEN INSERT INTO event_table VALUES (‘with grant option’); END IF;
IF (ora_space_error_info ( eno,typ,owner,ts,obj,subobj) = TRUE) THEN DBMS_OUTPUT.PUT_LINE(‘The object ‘|| obj || ‘ owned by ‘ || owner || ‘ has run out of space.’); END IF;

События срабатывания системных триггеров

Компиляция триггеров

  • Триггер создан в состоянии disabled (или переведен в такое состояние)
  • Событие триггера after startup on database
  • Событие триггера after logon on database или after logon on schema и происходит попытка залогиниться под пользователем System

Исключения в триггерах

  • Если событие триггера after startup on database или before shutdown on database
  • Если событие триггера after logon on database и пользователь имеет привилегию administer database trigger
  • Если событие триггера after logon on schema и пользователь или является владельцем схемы, или имеет привилегию alter any trigger

Порядок выполнения триггеров

Конструкция trigger_ordering_clause:

  1. Сначала выполняются все before statement триггера
  2. Потом все before each row триггера
  3. После все after each row триггера
  4. И в конце все after statement триггера

Включение/отключение триггеров

Это может понадобиться, например, для загрузки большого объема информации в таблицу.
Выполнить включение/отключение триггера можно с помощью команды:

ALTER TRIGGER [schema.]trigger_name < ENABLE | DISABLE >;

Чтобы включить/отключить сразу все триггеры на таблице:
ALTER TABLE table_name < ENABLE | DISABLE >ALL TRIGGERS;

Для изменения триггера можно или воспользоваться командой Create or replace trigger, или сначала удалить триггер drop trigger, а потом создать заново create trigger.
Операция alter trigger позволяет только включить/отключить триггер, скомпилировать его или переименовать.
Компиляция триггера:

alter trigger TRIGGER_NAME compile;

Права для операций с триггерами

Для работы с триггерами даже в своей схеме необходима привилегия create trigger, она дает права на создание, изменение и удаление.

grant create trigger to USER;

Для работы с триггерами во всех других схемах необходима привилегия * any trigger. Обратите внимание, что права даются отдельно на создание, изменение и удаление.

grant create any trigger to USER; grant alter any trigger to USER; grant drop any trigger to USER;

Для работы с системными триггерами уровня DATABASE необходима привилегия ADMINISTER DATABASE TRIGGER.

grant ADMINISTER DATABASE TRIGGER to USER;

Словари данных с информацией о триггерах:

  • dba_triggers – информация о триггерах
  • dba_source — код тела триггера
  • dba_objects – валидность триггера

Видео-запись лекции, по материалам которой и была написана эта статья:

Множество других видео по темам Oracle можно найти на этом канале: www.youtube.com/c/MoscowDevelopmentTeam

Другие статьи по Oracle

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru