2 @message |
assert
- Problem(s) detected:
- out_prep:
- Statement failed, SQLSTATE = HY000
- ALTER CHARACTER SET "SYSTEM"."ISO8859_1" failed
- -Cannot CREATE/ALTER/DROP CHARACTER SET in SYSTEM schema
- out_drop:
-
- ---
- +++
- @@ -12,5 +12,315 @@
- COMMIT WORK; +/* Table: PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY, Owner: SYSDBA */+CREATE TABLE PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY (ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,+ DDL_TRIGGER_NAME VARCHAR(64),+ EVENT_TYPE VARCHAR(25) NOT NULL,+ OBJECT_TYPE VARCHAR(25) NOT NULL,+ DDL_EVENT VARCHAR(25) NOT NULL,+ OBJECT_NAME VARCHAR(64) NOT NULL,+ DTS TIMESTAMP default 'now',+CONSTRAINT PK_LOG_DDL_TRIGGERS_ACTIVITY PRIMARY KEY (ID));+SET TERM ^ ;++/* Triggers only will work for SQL triggers */+CREATE TRIGGER PUBLIC.TRG_CREATE_TABLE_BEFORE +ACTIVE BEFORE CREATE TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TABLE_BEFORE +ACTIVE BEFORE ALTER TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TABLE_BEFORE +ACTIVE BEFORE DROP TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_PROCEDURE_BEFORE +ACTIVE BEFORE CREATE PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_PROCEDURE_BEFORE +ACTIVE BEFORE ALTER PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_PROCEDURE_BEFORE +ACTIVE BEFORE DROP PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_FUNCTION_BEFORE +ACTIVE BEFORE CREATE FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_FUNCTION_BEFORE +ACTIVE BEFORE ALTER FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_FUNCTION_BEFORE +ACTIVE BEFORE DROP FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_TRIGGER_BEFORE +ACTIVE BEFORE CREATE TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TRIGGER_BEFORE +ACTIVE BEFORE ALTER TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TRIGGER_BEFORE +ACTIVE BEFORE DROP TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_EXCEPTION_BEFORE +ACTIVE BEFORE CREATE EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_EXCEPTION_BEFORE +ACTIVE BEFORE ALTER EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_EXCEPTION_BEFORE +ACTIVE BEFORE DROP EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_VIEW_BEFORE +ACTIVE BEFORE CREATE VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_VIEW_BEFORE +ACTIVE BEFORE ALTER VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_VIEW_BEFORE +ACTIVE BEFORE DROP VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_DOMAIN_BEFORE +ACTIVE BEFORE CREATE DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_DOMAIN_BEFORE +ACTIVE BEFORE ALTER DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ANY_DDL_STATEMENT_BEFORE +ACTIVE BEFORE ANY DDL STATEMENT POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ANY_DDL_STATEMENT_BEFORE'+, 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')+);+ end ^+++SET TERM ; ^+COMMIT WORK;+ /* Grant permissions for this database */ GRANT USAGE ON SCHEMA PUBLIC TO USER PUBLIC;
-
LOG DETAILS:
2025-06-24 05:24:55.816
2025-06-24 05:24:55.823 act_db_main = <firebird.qa.plugin.Action object at [hex]>
2025-06-24 05:24:55.831 act_db_repl = <firebird.qa.plugin.Action object at [hex]>
2025-06-24 05:24:55.841 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-24 05:24:55.849
2025-06-24 05:24:55.861 @pytest.mark.replication
2025-06-24 05:24:55.870 @pytest.mark.version('>=4.0.1')
2025-06-24 05:24:55.881 def test_1(act_db_main: Action, act_db_repl: Action, capsys):
2025-06-24 05:24:55.887
2025-06-24 05:24:55.893 out_prep, out_main, out_drop = '', '', ''
2025-06-24 05:24:55.903
2025-06-24 05:24:55.910 # Obtain full path + filename for DB_MAIN and DB_REPL aliases.
2025-06-24 05:24:55.916 # NOTE: we must NOT use 'a.db.db_path' for ALIASED databases!
2025-06-24 05:24:55.923 # It will return '.' rather than full path+filename.
2025-06-24 05:24:55.929 # Use only con.info.name for that!
2025-06-24 05:24:55.935 #
2025-06-24 05:24:55.942 db_main_file, db_repl_file = '', ''
2025-06-24 05:24:55.949 db_main_fw, db_repl_fw = DbWriteMode.ASYNC, DbWriteMode.ASYNC
2025-06-24 05:24:55.955
2025-06-24 05:24:55.962 with act_db_main.db.connect(no_db_triggers = True) as con:
2025-06-24 05:24:55.971 #if act_db_main.vars['server-arch'] == 'Classic' and os.name != 'nt':
2025-06-24 05:24:55.982 # pytest.skip("Waiting for FIX: 'Engine is shutdown' in replication log for CS. Linux only.")
2025-06-24 05:24:55.991
2025-06-24 05:24:55.997 db_main_file = con.info.name
2025-06-24 05:24:56.004 db_main_fw = con.info.write_mode
2025-06-24 05:24:56.011
2025-06-24 05:24:56.018 with act_db_repl.db.connect(no_db_triggers = True) as con:
2025-06-24 05:24:56.028 db_repl_file = con.info.name
2025-06-24 05:24:56.037 db_repl_fw = con.info.write_mode
2025-06-24 05:24:56.046
2025-06-24 05:24:56.053 # ONLY FOR THIS test: forcedly change FW to OFF, without any condition.
2025-06-24 05:24:56.062 # Otherwise changes may not be delivered to replica for <MAX_TIME_FOR_WAIT_DATA_IN_REPLICA> seconds.
2025-06-24 05:24:56.073 #####################
2025-06-24 05:24:56.083 act_db_main.db.set_async_write()
2025-06-24 05:24:56.091 act_db_repl.db.set_async_write()
2025-06-24 05:24:56.100
2025-06-24 05:24:56.107
2025-06-24 05:24:56.113 # Must be EMPTY:
2025-06-24 05:24:56.122 out_prep = capsys.readouterr().out
2025-06-24 05:24:56.132
2025-06-24 05:24:56.143 sql_init = """
2025-06-24 05:24:56.152 set bail on;
2025-06-24 05:24:56.161
2025-06-24 05:24:56.172 recreate table log_ddl_triggers_activity (
2025-06-24 05:24:56.184 id int generated by default as identity constraint pk_log_ddl_triggers_activity primary key
2025-06-24 05:24:56.195 ,ddl_trigger_name varchar(64)
2025-06-24 05:24:56.206 ,event_type varchar(25) not null
2025-06-24 05:24:56.215 ,object_type varchar(25) not null
2025-06-24 05:24:56.222 ,ddl_event varchar(25) not null
2025-06-24 05:24:56.230 ,object_name varchar(64) not null
2025-06-24 05:24:56.236 ,dts timestamp default 'now'
2025-06-24 05:24:56.243 );
2025-06-24 05:24:56.255
2025-06-24 05:24:56.265
2025-06-24 05:24:56.277 set term ^;
2025-06-24 05:24:56.289 execute block as
2025-06-24 05:24:56.300 declare v_lf char(1) = x'0A';
2025-06-24 05:24:56.310 begin
2025-06-24 05:24:56.322 rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', '1');
2025-06-24 05:24:56.332
2025-06-24 05:24:56.341 for
2025-06-24 05:24:56.348 with
2025-06-24 05:24:56.355 a as (
2025-06-24 05:24:56.360 select 'ANY DDL STATEMENT' x from rdb$database union all
2025-06-24 05:24:56.366 select 'CREATE TABLE' from rdb$database union all
2025-06-24 05:24:56.374 select 'ALTER TABLE' from rdb$database union all
2025-06-24 05:24:56.383 select 'DROP TABLE' from rdb$database union all
2025-06-24 05:24:56.390 select 'CREATE PROCEDURE' from rdb$database union all
2025-06-24 05:24:56.398 select 'ALTER PROCEDURE' from rdb$database union all
2025-06-24 05:24:56.410 select 'DROP PROCEDURE' from rdb$database union all
2025-06-24 05:24:56.420 select 'CREATE FUNCTION' from rdb$database union all
2025-06-24 05:24:56.428 select 'ALTER FUNCTION' from rdb$database union all
2025-06-24 05:24:56.434 select 'DROP FUNCTION' from rdb$database union all
2025-06-24 05:24:56.440 select 'CREATE TRIGGER' from rdb$database union all
2025-06-24 05:24:56.446 select 'ALTER TRIGGER' from rdb$database union all
2025-06-24 05:24:56.450 select 'DROP TRIGGER' from rdb$database union all
2025-06-24 05:24:56.456 select 'CREATE EXCEPTION' from rdb$database union all
2025-06-24 05:24:56.461 select 'ALTER EXCEPTION' from rdb$database union all
2025-06-24 05:24:56.466 select 'DROP EXCEPTION' from rdb$database union all
2025-06-24 05:24:56.472 select 'CREATE VIEW' from rdb$database union all
2025-06-24 05:24:56.479 select 'ALTER VIEW' from rdb$database union all
2025-06-24 05:24:56.489 select 'DROP VIEW' from rdb$database union all
2025-06-24 05:24:56.497 select 'CREATE DOMAIN' from rdb$database union all
2025-06-24 05:24:56.503 select 'ALTER DOMAIN' from rdb$database union all
2025-06-24 05:24:56.509 select 'DROP DOMAIN' from rdb$database union all
2025-06-24 05:24:56.515 select 'CREATE ROLE' from rdb$database union all
2025-06-24 05:24:56.527 select 'ALTER ROLE' from rdb$database union all
2025-06-24 05:24:56.537 select 'DROP ROLE' from rdb$database union all
2025-06-24 05:24:56.548 select 'CREATE SEQUENCE' from rdb$database union all
2025-06-24 05:24:56.560 select 'ALTER SEQUENCE' from rdb$database union all
2025-06-24 05:24:56.571 select 'DROP SEQUENCE' from rdb$database union all
2025-06-24 05:24:56.582 select 'CREATE USER' from rdb$database union all
2025-06-24 05:24:56.593 select 'ALTER USER' from rdb$database union all
2025-06-24 05:24:56.604 select 'DROP USER' from rdb$database union all
2025-06-24 05:24:56.615 select 'CREATE INDEX' from rdb$database union all
2025-06-24 05:24:56.623 select 'ALTER INDEX' from rdb$database union all
2025-06-24 05:24:56.633 select 'DROP INDEX' from rdb$database union all
2025-06-24 05:24:56.645 select 'CREATE COLLATION' from rdb$database union all
2025-06-24 05:24:56.655 select 'DROP COLLATION' from rdb$database union all
2025-06-24 05:24:56.664 select 'ALTER CHARACTER SET' from rdb$database union all
2025-06-24 05:24:56.676 select 'CREATE PACKAGE' from rdb$database union all
2025-06-24 05:24:56.686 select 'ALTER PACKAGE' from rdb$database union all
2025-06-24 05:24:56.697 select 'DROP PACKAGE' from rdb$database union all
2025-06-24 05:24:56.706 select 'CREATE PACKAGE BODY' from rdb$database union all
2025-06-24 05:24:56.714 select 'DROP PACKAGE BODY' from rdb$database
2025-06-24 05:24:56.725 )
2025-06-24 05:24:56.735 ,e as (
2025-06-24 05:24:56.743 select 'before' w from rdb$database union all select 'after' from rdb$database
2025-06-24 05:24:56.751 )
2025-06-24 05:24:56.762 ,t as (
2025-06-24 05:24:56.773 select upper(trim(replace(trim(a.x),' ','_')) || iif(e.w='before', '_before', '_after')) as trg_name, a.x, e.w
2025-06-24 05:24:56.784 from e, a
2025-06-24 05:24:56.793 )
2025-06-24 05:24:56.803
2025-06-24 05:24:56.814 select
2025-06-24 05:24:56.822 'create or alter trigger trg_' || t.trg_name
2025-06-24 05:24:56.830 || ' active ' || t.w || ' ' || trim(t.x) || ' as '
2025-06-24 05:24:56.840 || :v_lf
2025-06-24 05:24:56.851 || 'begin'
2025-06-24 05:24:56.859 || :v_lf
2025-06-24 05:24:56.867 || q'{ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then}'
2025-06-24 05:24:56.874 || :v_lf
2025-06-24 05:24:56.883 || ' insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values('
2025-06-24 05:24:56.893 || :v_lf
2025-06-24 05:24:56.901 || q'{'}' || trim(t.trg_name) || q'{'}'
2025-06-24 05:24:56.907 || :v_lf
2025-06-24 05:24:56.913 || q'{, rdb$get_context('DDL_TRIGGER', 'EVENT_TYPE')}'
2025-06-24 05:24:56.917 || :v_lf
2025-06-24 05:24:56.922 || q'{, rdb$get_context('DDL_TRIGGER', 'OBJECT_TYPE')}'
2025-06-24 05:24:56.926 || :v_lf
2025-06-24 05:24:56.931 || q'{, rdb$get_context('DDL_TRIGGER', 'DDL_EVENT')}'
2025-06-24 05:24:56.935 || :v_lf
2025-06-24 05:24:56.940 || q'{, rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME')}'
2025-06-24 05:24:56.945 || :v_lf
2025-06-24 05:24:56.950 || ');'
2025-06-24 05:24:56.955 || :v_lf
2025-06-24 05:24:56.960 || ' end'
2025-06-24 05:24:56.966 as sttm
2025-06-24 05:24:56.976 from t
2025-06-24 05:24:56.986 as cursor c
2025-06-24 05:24:56.996 do begin
2025-06-24 05:24:57.007 execute statement(c.sttm) with autonomous transaction;
2025-06-24 05:24:57.015 end
2025-06-24 05:24:57.022
2025-06-24 05:24:57.031 rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', null);
2025-06-24 05:24:57.038 end
2025-06-24 05:24:57.045 ^
2025-06-24 05:24:57.051 commit
2025-06-24 05:24:57.056 ^
2025-06-24 05:24:57.062
2025-06-24 05:24:57.072 create table test(id int not null, name varchar(10))
2025-06-24 05:24:57.080 ^
2025-06-24 05:24:57.087 alter table test add constraint test_pk primary key(id)
2025-06-24 05:24:57.095 ^
2025-06-24 05:24:57.104 ----------
2025-06-24 05:24:57.112 create procedure sp_test as begin end
2025-06-24 05:24:57.119 ^
2025-06-24 05:24:57.125 alter procedure sp_test as declare x int; begin x=1; end
2025-06-24 05:24:57.131 ^
2025-06-24 05:24:57.136 ----------
2025-06-24 05:24:57.142 create function fn_test(a_id int) returns bigint as
2025-06-24 05:24:57.153 begin
2025-06-24 05:24:57.164 return a_id * a_id;
2025-06-24 05:24:57.172 end
2025-06-24 05:24:57.178 ^
2025-06-24 05:24:57.185 alter function fn_test(a_id int) returns int128 as
2025-06-24 05:24:57.190 begin
2025-06-24 05:24:57.196 return a_id * a_id * a_id;
2025-06-24 05:24:57.201 end
2025-06-24 05:24:57.207 ^
2025-06-24 05:24:57.212 ----------
2025-06-24 05:24:57.218 create trigger trg_connect_test on connect as
2025-06-24 05:24:57.229 begin
2025-06-24 05:24:57.238 end
2025-06-24 05:24:57.245 ^
2025-06-24 05:24:57.252 alter trigger trg_connect_test as
2025-06-24 05:24:57.259 declare x int;
2025-06-24 05:24:57.267 begin
2025-06-24 05:24:57.277 x = 1;
2025-06-24 05:24:57.285 end
2025-06-24 05:24:57.292 ^
2025-06-24 05:24:57.298 ----------
2025-06-24 05:24:57.307 create exception exc_test 'Invalud value: @1'
2025-06-24 05:24:57.317 ^
2025-06-24 05:24:57.324 alter exception exc_test 'Bad values: @1 and @2'
2025-06-24 05:24:57.330 ^
2025-06-24 05:24:57.340 ----------
2025-06-24 05:24:57.350 create view v_test as select 1 x from rdb$database
2025-06-24 05:24:57.357 ^
2025-06-24 05:24:57.368 alter view v_test as select 1 x, 2 y from rdb$database
2025-06-24 05:24:57.378 ^
2025-06-24 05:24:57.390 ----------
2025-06-24 05:24:57.403 create domain dm_test int
2025-06-24 05:24:57.414 ^
2025-06-24 05:24:57.421 alter domain dm_test set not null
2025-06-24 05:24:57.426 ^
2025-06-24 05:24:57.432 ----------
2025-06-24 05:24:57.438 create role r_test
2025-06-24 05:24:57.448 ^
2025-06-24 05:24:57.459 alter role r_test set system privileges to use_gstat_utility, ignore_db_triggers
2025-06-24 05:24:57.470 ^
2025-06-24 05:24:57.477 ----------
2025-06-24 05:24:57.484 create sequence g_test
2025-06-24 05:24:57.491 ^
2025-06-24 05:24:57.504 alter sequence g_test restart with 123
2025-06-24 05:24:57.514 ^
2025-06-24 05:24:57.523 ----------
2025-06-24 05:24:57.531 /*
2025-06-24 05:24:57.538 create or alter user u_test password '123' using plugin Srp
2025-06-24 05:24:57.549 ^
2025-06-24 05:24:57.558 alter user u_test password '456'
2025-06-24 05:24:57.567 ^
2025-06-24 05:24:57.573 */
2025-06-24 05:24:57.579 ----------
2025-06-24 05:24:57.585 create index test_name on test(name)
2025-06-24 05:24:57.591 ^
2025-06-24 05:24:57.599 alter index test_name inactive
2025-06-24 05:24:57.610 ^
2025-06-24 05:24:57.621 ----------
2025-06-24 05:24:57.630 create collation name_coll for utf8 from unicode case insensitive
2025-06-24 05:24:57.643 ^
2025-06-24 05:24:57.653 ----------
2025-06-24 05:24:57.665 alter character set iso8859_1 set default collation pt_br
2025-06-24 05:24:57.677 ^
2025-06-24 05:24:57.686 ----------
2025-06-24 05:24:57.695 create or alter package pg_test as
2025-06-24 05:24:57.702 begin
2025-06-24 05:24:57.710 function pg_fn1 returns int;
2025-06-24 05:24:57.716 end
2025-06-24 05:24:57.722 ^
2025-06-24 05:24:57.729 alter package pg_test as
2025-06-24 05:24:57.735 begin
2025-06-24 05:24:57.742 function pg_fn1(a_x int) returns int128;
2025-06-24 05:24:57.754 end
2025-06-24 05:24:57.763 ^
2025-06-24 05:24:57.771
2025-06-24 05:24:57.778 create package body pg_test as
2025-06-24 05:24:57.790 begin
2025-06-24 05:24:57.800 function pg_fn1(a_x int) returns int128 as
2025-06-24 05:24:57.812 begin
2025-06-24 05:24:57.825 return a_x * a_x * a_x;
2025-06-24 05:24:57.840 end
2025-06-24 05:24:57.851 end
2025-06-24 05:24:57.862 ^
2025-06-24 05:24:57.872 recreate table t_ddl_completed(id int primary key)
2025-06-24 05:24:57.881 ^
2025-06-24 05:24:57.888 commit
2025-06-24 05:24:57.895 ^
2025-06-24 05:24:57.905 """
2025-06-24 05:24:57.919
2025-06-24 05:24:57.930 act_db_main.isql(switches=['-q'], input = sql_init, combine_output = True)
2025-06-24 05:24:57.938 out_prep = act_db_main.clean_stdout
2025-06-24 05:24:57.945 act_db_main.reset()
2025-06-24 05:24:57.955
2025-06-24 05:24:57.968 if out_prep:
2025-06-24 05:24:57.977 # Init SQL raised error.
2025-06-24 05:24:57.985 pass
2025-06-24 05:24:57.997 else:
2025-06-24 05:24:58.011
2025-06-24 05:24:58.023 # Query to be used for check that all DB objects present in replica (after last DDL statement completed on master DB):
2025-06-24 05:24:58.036 ddl_ready_query = "select 1 from rdb$relations r where r.rdb$relation_name = upper('t_ddl_completed')"
2025-06-24 05:24:58.050 isql_check_script = ''
2025-06-24 05:24:58.059
2025-06-24 05:24:58.068 # DO NOT DELETE! To be used after #7547 will be fixed
2025-06-24 05:24:58.075 # (currently this query returns NOTHING on replica db)
2025-06-24 05:24:58.082 ######################################
2025-06-24 05:24:58.090 #isql_check_script = """
2025-06-24 05:24:58.097 # set list on;
2025-06-24 05:24:58.105 # set count on;
2025-06-24 05:24:58.111 # select
2025-06-24 05:24:58.118 # a.id
2025-06-24 05:24:58.125 # ,a.ddl_trigger_name
2025-06-24 05:24:58.136 # ,a.event_type
2025-06-24 05:24:58.147 # ,a.object_type
2025-06-24 05:24:58.156 # ,a.ddl_event
2025-06-24 05:24:58.164 # ,a.object_name
2025-06-24 05:24:58.171 # from log_ddl_triggers_activity a
2025-06-24 05:24:58.183 # order by a.id;
2025-06-24 05:24:58.196 #"""
2025-06-24 05:24:58.205
2025-06-24 05:24:58.213 isql_expected_out = """
2025-06-24 05:24:58.219 """
2025-06-24 05:24:58.226
2025-06-24 05:24:58.232 ##############################################################################
2025-06-24 05:24:58.238 ### W A I T U N T I L R E P L I C A B E C O M E S A C T U A L ###
2025-06-24 05:24:58.247 ##############################################################################
2025-06-24 05:24:58.260 watch_replica( act_db_repl, MAX_TIME_FOR_WAIT_DATA_IN_REPLICA, ddl_ready_query, isql_check_script, isql_expected_out)
2025-06-24 05:24:58.269 # Must be EMPTY:
2025-06-24 05:24:58.275 out_main = capsys.readouterr().out
2025-06-24 05:24:58.281
2025-06-24 05:24:58.286
2025-06-24 05:24:58.292 drop_db_objects(act_db_main, act_db_repl, capsys)
2025-06-24 05:24:58.298
2025-06-24 05:24:58.308 # Return FW to initial values (if needed):
2025-06-24 05:24:58.318 if db_main_fw == DbWriteMode.SYNC:
2025-06-24 05:24:58.326 act_db_main.db.set_sync_write()
2025-06-24 05:24:58.333 if db_repl_fw == DbWriteMode.SYNC:
2025-06-24 05:24:58.340 act_db_repl.db.set_sync_write()
2025-06-24 05:24:58.345
2025-06-24 05:24:58.352 # Must be EMPTY:
2025-06-24 05:24:58.358 out_drop = capsys.readouterr().out
2025-06-24 05:24:58.367
2025-06-24 05:24:58.380 if [ x for x in (out_prep, out_main, out_drop) if x.strip() ]:
2025-06-24 05:24:58.390 # We have a problem either with DDL/DML or with dropping DB objects.
2025-06-24 05:24:58.399 # First, we have to RECREATE both master and slave databases
2025-06-24 05:24:58.406 # (otherwise further execution of this test or other replication-related tests most likely will fail):
2025-06-24 05:24:58.413 out_reset = reset_replication(act_db_main, act_db_repl, db_main_file, db_repl_file)
2025-06-24 05:24:58.418
2025-06-24 05:24:58.424 # Next, we display out_main, out_drop and out_reset:
2025-06-24 05:24:58.430 #
2025-06-24 05:24:58.437 print('Problem(s) detected:')
2025-06-24 05:24:58.443 if out_prep.strip():
2025-06-24 05:24:58.448 print('out_prep:')
2025-06-24 05:24:58.454 print(out_prep)
2025-06-24 05:24:58.460 if out_main.strip():
2025-06-24 05:24:58.465 print('out_main:')
2025-06-24 05:24:58.471 print(out_main)
2025-06-24 05:24:58.477 if out_drop.strip():
2025-06-24 05:24:58.483 print('out_drop:')
2025-06-24 05:24:58.488 print(out_drop)
2025-06-24 05:24:58.494 if out_reset.strip():
2025-06-24 05:24:58.506 print('out_reset:')
2025-06-24 05:24:58.518 print(out_reset)
2025-06-24 05:24:58.526
2025-06-24 05:24:58.533 > assert '' == capsys.readouterr().out
2025-06-24 05:24:58.538 E assert
2025-06-24 05:24:58.544 E - Problem(s) detected:
2025-06-24 05:24:58.549 E - out_prep:
2025-06-24 05:24:58.555 E - Statement failed, SQLSTATE = HY000
2025-06-24 05:24:58.561 E - ALTER CHARACTER SET "SYSTEM"."ISO8859_1" failed
2025-06-24 05:24:58.567 E - -Cannot CREATE/ALTER/DROP CHARACTER SET in SYSTEM schema
2025-06-24 05:24:58.573 E - out_drop:
2025-06-24 05:24:58.580 E -
2025-06-24 05:24:58.587 E - ---
2025-06-24 05:24:58.594 E - +++
2025-06-24 05:24:58.601 E - @@ -12,5 +12,315 @@
2025-06-24 05:24:58.628 E - COMMIT WORK; +/* Table: PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY, Owner: SYSDBA */+CREATE TABLE PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY (ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,+ DDL_TRIGGER_NAME VARCHAR(64),+ EVENT_TYPE VARCHAR(25) NOT NULL,+ OBJECT_TYPE VARCHAR(25) NOT NULL,+ DDL_EVENT VARCHAR(25) NOT NULL,+ OBJECT_NAME VARCHAR(64) NOT NULL,+ DTS TIMESTAMP default 'now',+CONSTRAINT PK_LOG_DDL_TRIGGERS_ACTIVITY PRIMARY KEY (ID));+SET TERM ^ ;++/* Triggers only will work for SQL triggers */+CREATE TRIGGER PUBLIC.TRG_CREATE_TABLE_BEFORE +ACTIVE BEFORE CREATE TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TABLE_BEFORE +ACTIVE BEFORE ALTER TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TABLE_BEFORE +ACTIVE BEFORE DROP TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_PROCEDURE_BEFORE +ACTIVE BEFORE CREATE PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_PROCEDURE_BEFORE +ACTIVE BEFORE ALTER PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_PROCEDURE_BEFORE +ACTIVE BEFORE DROP PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_FUNCTION_BEFORE +ACTIVE BEFORE CREATE FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_FUNCTION_BEFORE +ACTIVE BEFORE ALTER FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_FUNCTION_BEFORE +ACTIVE BEFORE DROP FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_TRIGGER_BEFORE +ACTIVE BEFORE CREATE TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TRIGGER_BEFORE +ACTIVE BEFORE ALTER TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TRIGGER_BEFORE +ACTIVE BEFORE DROP TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_EXCEPTION_BEFORE +ACTIVE BEFORE CREATE EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_EXCEPTION_BEFORE +ACTIVE BEFORE ALTER EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_EXCEPTION_BEFORE +ACTIVE BEFORE DROP EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_VIEW_BEFORE +ACTIVE BEFORE CREATE VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_VIEW_BEFORE +ACTIVE BEFORE ALTER VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_VIEW_BEFORE +ACTIVE BEFORE DROP VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_DOMAIN_BEFORE +ACTIVE BEFORE CREATE DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_DOMAIN_BEFORE +ACTIVE BEFORE ALTER DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ANY_DDL_STATEMENT_BEFORE +ACTIVE BEFORE ANY DDL STATEMENT POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ANY_DDL_STATEMENT_BEFORE'+, 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')+);+ end ^+++SET TERM ; ^+COMMIT WORK;+ /* Grant permissions for this database */ GRANT USAGE ON SCHEMA PUBLIC TO USER PUBLIC;
2025-06-24 05:24:58.634 E -
2025-06-24 05:24:58.640
2025-06-24 05:24:58.647 tests/functional/replication/test_ddl_triggers_must_not_fire_on_replica.py:663: AssertionError
|
3 #text |
act_db_main = <firebird.qa.plugin.Action pytest object at [hex]>
act_db_repl = <firebird.qa.plugin.Action pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.replication
@pytest.mark.version('>=4.0.1')
def test_1(act_db_main: Action, act_db_repl: Action, capsys):
out_prep, out_main, out_drop = '', '', ''
# Obtain full path + filename for DB_MAIN and DB_REPL aliases.
# NOTE: we must NOT use 'a.db.db_path' for ALIASED databases!
# It will return '.' rather than full path+filename.
# Use only con.info.name for that!
#
db_main_file, db_repl_file = '', ''
db_main_fw, db_repl_fw = DbWriteMode.ASYNC, DbWriteMode.ASYNC
with act_db_main.db.connect(no_db_triggers = True) as con:
#if act_db_main.vars['server-arch'] == 'Classic' and os.name != 'nt':
# pytest.skip("Waiting for FIX: 'Engine is shutdown' in replication log for CS. Linux only.")
db_main_file = con.info.name
db_main_fw = con.info.write_mode
with act_db_repl.db.connect(no_db_triggers = True) as con:
db_repl_file = con.info.name
db_repl_fw = con.info.write_mode
# ONLY FOR THIS test: forcedly change FW to OFF, without any condition.
# Otherwise changes may not be delivered to replica for <MAX_TIME_FOR_WAIT_DATA_IN_REPLICA> seconds.
#####################
act_db_main.db.set_async_write()
act_db_repl.db.set_async_write()
# Must be EMPTY:
out_prep = capsys.readouterr().out
sql_init = """
set bail on;
recreate table log_ddl_triggers_activity (
id int generated by default as identity constraint pk_log_ddl_triggers_activity primary key
,ddl_trigger_name varchar(64)
,event_type varchar(25) not null
,object_type varchar(25) not null
,ddl_event varchar(25) not null
,object_name varchar(64) not null
,dts timestamp default 'now'
);
set term ^;
execute block as
declare v_lf char(1) = x'0A';
begin
rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', '1');
for
with
a as (
select 'ANY DDL STATEMENT' x from rdb$database union all
select 'CREATE TABLE' from rdb$database union all
select 'ALTER TABLE' from rdb$database union all
select 'DROP TABLE' from rdb$database union all
select 'CREATE PROCEDURE' from rdb$database union all
select 'ALTER PROCEDURE' from rdb$database union all
select 'DROP PROCEDURE' from rdb$database union all
select 'CREATE FUNCTION' from rdb$database union all
select 'ALTER FUNCTION' from rdb$database union all
select 'DROP FUNCTION' from rdb$database union all
select 'CREATE TRIGGER' from rdb$database union all
select 'ALTER TRIGGER' from rdb$database union all
select 'DROP TRIGGER' from rdb$database union all
select 'CREATE EXCEPTION' from rdb$database union all
select 'ALTER EXCEPTION' from rdb$database union all
select 'DROP EXCEPTION' from rdb$database union all
select 'CREATE VIEW' from rdb$database union all
select 'ALTER VIEW' from rdb$database union all
select 'DROP VIEW' from rdb$database union all
select 'CREATE DOMAIN' from rdb$database union all
select 'ALTER DOMAIN' from rdb$database union all
select 'DROP DOMAIN' from rdb$database union all
select 'CREATE ROLE' from rdb$database union all
select 'ALTER ROLE' from rdb$database union all
select 'DROP ROLE' from rdb$database union all
select 'CREATE SEQUENCE' from rdb$database union all
select 'ALTER SEQUENCE' from rdb$database union all
select 'DROP SEQUENCE' from rdb$database union all
select 'CREATE USER' from rdb$database union all
select 'ALTER USER' from rdb$database union all
select 'DROP USER' from rdb$database union all
select 'CREATE INDEX' from rdb$database union all
select 'ALTER INDEX' from rdb$database union all
select 'DROP INDEX' from rdb$database union all
select 'CREATE COLLATION' from rdb$database union all
select 'DROP COLLATION' from rdb$database union all
select 'ALTER CHARACTER SET' from rdb$database union all
select 'CREATE PACKAGE' from rdb$database union all
select 'ALTER PACKAGE' from rdb$database union all
select 'DROP PACKAGE' from rdb$database union all
select 'CREATE PACKAGE BODY' from rdb$database union all
select 'DROP PACKAGE BODY' from rdb$database
)
,e as (
select 'before' w from rdb$database union all select 'after' from rdb$database
)
,t as (
select upper(trim(replace(trim(a.x),' ','_')) || iif(e.w='before', '_before', '_after')) as trg_name, a.x, e.w
from e, a
)
select
'create or alter trigger trg_' || t.trg_name
|| ' active ' || t.w || ' ' || trim(t.x) || ' as '
|| :v_lf
|| 'begin'
|| :v_lf
|| q'{ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then}'
|| :v_lf
|| ' insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values('
|| :v_lf
|| q'{'}' || trim(t.trg_name) || q'{'}'
|| :v_lf
|| q'{, rdb$get_context('DDL_TRIGGER', 'EVENT_TYPE')}'
|| :v_lf
|| q'{, rdb$get_context('DDL_TRIGGER', 'OBJECT_TYPE')}'
|| :v_lf
|| q'{, rdb$get_context('DDL_TRIGGER', 'DDL_EVENT')}'
|| :v_lf
|| q'{, rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME')}'
|| :v_lf
|| ');'
|| :v_lf
|| ' end'
as sttm
from t
as cursor c
do begin
execute statement(c.sttm) with autonomous transaction;
end
rdb$set_context('USER_SESSION', 'SKIP_DDL_TRIGGER', null);
end
^
commit
^
create table test(id int not null, name varchar(10))
^
alter table test add constraint test_pk primary key(id)
^
----------
create procedure sp_test as begin end
^
alter procedure sp_test as declare x int; begin x=1; end
^
----------
create function fn_test(a_id int) returns bigint as
begin
return a_id * a_id;
end
^
alter function fn_test(a_id int) returns int128 as
begin
return a_id * a_id * a_id;
end
^
----------
create trigger trg_connect_test on connect as
begin
end
^
alter trigger trg_connect_test as
declare x int;
begin
x = 1;
end
^
----------
create exception exc_test 'Invalud value: @1'
^
alter exception exc_test 'Bad values: @1 and @2'
^
----------
create view v_test as select 1 x from rdb$database
^
alter view v_test as select 1 x, 2 y from rdb$database
^
----------
create domain dm_test int
^
alter domain dm_test set not null
^
----------
create role r_test
^
alter role r_test set system privileges to use_gstat_utility, ignore_db_triggers
^
----------
create sequence g_test
^
alter sequence g_test restart with 123
^
----------
/*
create or alter user u_test password '123' using plugin Srp
^
alter user u_test password '456'
^
*/
----------
create index test_name on test(name)
^
alter index test_name inactive
^
----------
create collation name_coll for utf8 from unicode case insensitive
^
----------
alter character set iso8859_1 set default collation pt_br
^
----------
create or alter package pg_test as
begin
function pg_fn1 returns int;
end
^
alter package pg_test as
begin
function pg_fn1(a_x int) returns int128;
end
^
create package body pg_test as
begin
function pg_fn1(a_x int) returns int128 as
begin
return a_x * a_x * a_x;
end
end
^
recreate table t_ddl_completed(id int primary key)
^
commit
^
"""
act_db_main.isql(switches=['-q'], input = sql_init, combine_output = True)
out_prep = act_db_main.clean_stdout
act_db_main.reset()
if out_prep:
# Init SQL raised error.
pass
else:
# Query to be used for check that all DB objects present in replica (after last DDL statement completed on master DB):
ddl_ready_query = "select 1 from rdb$relations r where r.rdb$relation_name = upper('t_ddl_completed')"
isql_check_script = ''
# DO NOT DELETE! To be used after #7547 will be fixed
# (currently this query returns NOTHING on replica db)
######################################
#isql_check_script = """
# set list on;
# set count on;
# select
# a.id
# ,a.ddl_trigger_name
# ,a.event_type
# ,a.object_type
# ,a.ddl_event
# ,a.object_name
# from log_ddl_triggers_activity a
# order by a.id;
#"""
isql_expected_out = """
"""
##############################################################################
### W A I T U N T I L R E P L I C A B E C O M E S A C T U A L ###
##############################################################################
watch_replica( act_db_repl, MAX_TIME_FOR_WAIT_DATA_IN_REPLICA, ddl_ready_query, isql_check_script, isql_expected_out)
# Must be EMPTY:
out_main = capsys.readouterr().out
drop_db_objects(act_db_main, act_db_repl, capsys)
# Return FW to initial values (if needed):
if db_main_fw == DbWriteMode.SYNC:
act_db_main.db.set_sync_write()
if db_repl_fw == DbWriteMode.SYNC:
act_db_repl.db.set_sync_write()
# Must be EMPTY:
out_drop = capsys.readouterr().out
if [ x for x in (out_prep, out_main, out_drop) if x.strip() ]:
# We have a problem either with DDL/DML or with dropping DB objects.
# First, we have to RECREATE both master and slave databases
# (otherwise further execution of this test or other replication-related tests most likely will fail):
out_reset = reset_replication(act_db_main, act_db_repl, db_main_file, db_repl_file)
# Next, we display out_main, out_drop and out_reset:
#
print('Problem(s) detected:')
if out_prep.strip():
print('out_prep:')
print(out_prep)
if out_main.strip():
print('out_main:')
print(out_main)
if out_drop.strip():
print('out_drop:')
print(out_drop)
if out_reset.strip():
print('out_reset:')
print(out_reset)
> assert '' == capsys.readouterr().out
E assert
E - Problem(s) detected:
E - out_prep:
E - Statement failed, SQLSTATE = HY000
E - ALTER CHARACTER SET "SYSTEM"."ISO8859_1" failed
E - -Cannot CREATE/ALTER/DROP CHARACTER SET in SYSTEM schema
E - out_drop:
E -
E - ---
E - +++
E - @@ -12,5 +12,315 @@
E - COMMIT WORK; +/* Table: PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY, Owner: SYSDBA */+CREATE TABLE PUBLIC.LOG_DDL_TRIGGERS_ACTIVITY (ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,+ DDL_TRIGGER_NAME VARCHAR(64),+ EVENT_TYPE VARCHAR(25) NOT NULL,+ OBJECT_TYPE VARCHAR(25) NOT NULL,+ DDL_EVENT VARCHAR(25) NOT NULL,+ OBJECT_NAME VARCHAR(64) NOT NULL,+ DTS TIMESTAMP default 'now',+CONSTRAINT PK_LOG_DDL_TRIGGERS_ACTIVITY PRIMARY KEY (ID));+SET TERM ^ ;++/* Triggers only will work for SQL triggers */+CREATE TRIGGER PUBLIC.TRG_CREATE_TABLE_BEFORE +ACTIVE BEFORE CREATE TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TABLE_BEFORE +ACTIVE BEFORE ALTER TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TABLE_BEFORE +ACTIVE BEFORE DROP TABLE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TABLE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_PROCEDURE_BEFORE +ACTIVE BEFORE CREATE PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_PROCEDURE_BEFORE +ACTIVE BEFORE ALTER PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_PROCEDURE_BEFORE +ACTIVE BEFORE DROP PROCEDURE POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_PROCEDURE_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_FUNCTION_BEFORE +ACTIVE BEFORE CREATE FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_FUNCTION_BEFORE +ACTIVE BEFORE ALTER FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_FUNCTION_BEFORE +ACTIVE BEFORE DROP FUNCTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_FUNCTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_TRIGGER_BEFORE +ACTIVE BEFORE CREATE TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_TRIGGER_BEFORE +ACTIVE BEFORE ALTER TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_TRIGGER_BEFORE +ACTIVE BEFORE DROP TRIGGER POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_TRIGGER_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_EXCEPTION_BEFORE +ACTIVE BEFORE CREATE EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_EXCEPTION_BEFORE +ACTIVE BEFORE ALTER EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_EXCEPTION_BEFORE +ACTIVE BEFORE DROP EXCEPTION POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_EXCEPTION_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_VIEW_BEFORE +ACTIVE BEFORE CREATE VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_VIEW_BEFORE +ACTIVE BEFORE ALTER VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_DROP_VIEW_BEFORE +ACTIVE BEFORE DROP VIEW POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'DROP_VIEW_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_CREATE_DOMAIN_BEFORE +ACTIVE BEFORE CREATE DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'CREATE_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ALTER_DOMAIN_BEFORE +ACTIVE BEFORE ALTER DOMAIN POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ALTER_DOMAIN_BEFORE'+, 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')+);+ end ^++CREATE TRIGGER PUBLIC.TRG_ANY_DDL_STATEMENT_BEFORE +ACTIVE BEFORE ANY DDL STATEMENT POSITION 0 +as +begin+ if (rdb$get_context('USER_SESSION', 'SKIP_DDL_TRIGGER') is null) then+ insert into log_ddl_triggers_activity(ddl_trigger_name, event_type, object_type, ddl_event, object_name) values(+'ANY_DDL_STATEMENT_BEFORE'+, 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')+);+ end ^+++SET TERM ; ^+COMMIT WORK;+ /* Grant permissions for this database */ GRANT USAGE ON SCHEMA PUBLIC TO USER PUBLIC;
E -
tests/functional/replication/test_ddl_triggers_must_not_fire_on_replica.py:663: AssertionError
|