Руководство по языку sql
Download 1.22 Mb. Pdf ko'rish
|
Firebird3 SQL features
create exception e_invalid_sp_name 'Неверное имя хранимой
процедуры (должно начинаться с SP_)'; set term !; create trigger trig_ddl_sp before CREATE PROCEDURE as begin if (rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME') not starting 'SP_') then exception e_invalid_sp_name; end! -- Test create procedure sp_test as begin end! create procedure test as begin end! -- Statement failed, SQLSTATE = 42000 -- exception 1 -- -E_INVALID_SP_NAME -- -Неверное имя хранимой процедуры (должно начинаться с SP_) -- -At trigger 'TRIG_DDL_SP' line: 4, col: 5 set term ;! Реализация пользовательской безопасности для DDL, в данном случае разрешено запускать DDL команды только определѐнным пользователям: create exception e_access_denied 'Access denied'; set term !; create trigger trig_ddl before any ddl statement as begin if (current_user <> 'SUPER_USER') then exception e_access_denied; Новые возможности языка SQL Firebird 3.0 64 end! -- Test create procedure sp_test as begin end! -- The last command raises this exception and procedure SP_TEST is not created -- Statement failed, SQLSTATE = 42000 -- exception 1 -- -E_ACCESS_DENIED -- -Access denied -- -At trigger 'TRIG_DDL' line: 4, col: 5 set term ;! Замечание: На самом деле в Firebird 3 появились права на DDL операторы, поэтому прибегать к написанию DDL триггера нужно только в случае, если того же самого эффекта невозможно достичь стандартными методами. Использование триггеров для регистрации DDL действий и их попыток: create sequence ddl_seq; create table ddl_log ( id bigint not null primary key, moment timestamp not null, user_name varchar(31) not null, event_type varchar(25) not null, object_type varchar(25) not null, ddl_event varchar(25) not null, object_name varchar(31) not null, sql_text blob sub_type text not null, ok char(1) not null ); set term !; create trigger trig_ddl_log_before before any ddl statement as declare id type of column ddl_log.id; begin -- Мы должны производить изменения в AUTONOMOUS TRANSACTION, -- таким образом, если произойдѐт исключение и команда -- не будет запущена, она всѐ равно будет зарегистрирована. Новые возможности языка SQL Firebird 3.0 65 in autonomous transaction do begin insert into ddl_log ( id, moment, user_name, event_type, object_type, ddl_event, object_name, sql_text, ok) values (next value for ddl_seq, current_timestamp, current_user, rdb$get_context('DDL_TRIGGER', 'EVENT_TYPE'), rdb$get_context('DDL_TRIGGER', 'OBJECT_TYPE'), rdb$get_context('DDL_TRIGGER', 'DDL_EVENT'), rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME'), rdb$get_context('DDL_TRIGGER', 'SQL_TEXT'), 'N') returning id into id; rdb$set_context('USER_SESSION', 'trig_ddl_log_id', id); end end! -- Примечание: -- созданный выше триггер будет запущен для этой DDL. -- Хорошей идеей является использование –nodbtriggers -- при работе с ним create trigger trig_ddl_log_after after any ddl statement as begin -- Здесь нам требуется автономная транзакция, -- потому что в оригинальной транзакции -- мы не увидим запись, вставленную в -- BEFORE триггере в автономной транзакции, -- если пользовательская транзакции не запущена -- с режимом изоляции READ COMMITTED. in autonomous transaction do update ddl_log set ok = 'Y' where id = rdb$get_context('USER_SESSION', 'trig_ddl_log_id'); end! commit! set term ;! -- Удаляем запись о создании trig_ddl_log_after. delete from ddl_log; commit; -- Тест -- Эта команда будет зарегистрирована единожды -- (т.к. T1 не существует, RECREATE вызовет событие CREATE) -- с OK = Y. recreate table t1 ( Новые возможности языка SQL Firebird 3.0 66 n1 integer, n2 integer ); -- Оператор не выполнится, т.к. T1 уже существует, -- таким образом OK будет иметь значение N. create table t1 ( n1 integer, n2 integer ); -- T2 не существует. Это действие не будет зарегистрировано. drop table t2; -- Это действие будет зарегистрировано дважды -- (т.к. T1 существует, действие RECREATE рассматривается -- как DROP и CREATE) с полем OK = Y. recreate table t1 ( n integer ); commit; select id, ddl_event, object_name, sql_text, ok from ddl_log order by id; Download 1.22 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling