/******************************************************************************/ /*** Generated by IBExpert 2006.03.06.2 07.03.2006 13:25:59 ***/ /******************************************************************************/ SET SQL DIALECT 3; SET NAMES WIN1252; CREATE DATABASE 'localhost:C:\DB2.FDB' USER 'SYSDBA' PASSWORD 'masterkey' PAGE_SIZE 4096 DEFAULT CHARACTER SET WIN1252; /******************************************************************************/ /*** User Defined Functions ***/ /******************************************************************************/ DECLARE EXTERNAL FUNCTION CRLF RETURNS CSTRING(3) CHARACTER SET WIN1252 ENTRY_POINT 'CRLF' MODULE_NAME 'FreeUDFLib'; DECLARE EXTERNAL FUNCTION RTRIM CSTRING(256) CHARACTER SET WIN1252 RETURNS CSTRING(256) CHARACTER SET WIN1252 ENTRY_POINT 'fn_rtrim' MODULE_NAME 'rfunc'; DECLARE EXTERNAL FUNCTION TRIM CSTRING(256) CHARACTER SET WIN1252 RETURNS CSTRING(256) CHARACTER SET WIN1252 ENTRY_POINT 'fn_trim' MODULE_NAME 'rfunc'; DECLARE EXTERNAL FUNCTION LONGSTRREPLACE CSTRING(16384), CSTRING(16384), CSTRING(16384) RETURNS CSTRING(16384) FREE_IT ENTRY_POINT 'fn_longstrreplace' MODULE_NAME 'rfunc'; DECLARE EXTERNAL FUNCTION LONGTRIM CSTRING(16384) RETURNS CSTRING(16384) ENTRY_POINT 'fn_trim' MODULE_NAME 'rfunc'; /******************************************************************************/ /*** Generators ***/ /******************************************************************************/ CREATE GENERATOR ID; SET GENERATOR ID TO 4319; SET TERM ^ ; /******************************************************************************/ /*** Stored Procedures ***/ /******************************************************************************/ CREATE PROCEDURE DROPLOG AS BEGIN EXIT; END^ CREATE PROCEDURE IBE$REPL_IU ( ID BIGINT, USR CHAR(30) CHARACTER SET WIN1252, DB VARCHAR(254) CHARACTER SET WIN1252, SQLSTMT BLOB SUB_TYPE 1 SEGMENT SIZE 80, CRT_TME TIMESTAMP, RPL_TME TIMESTAMP) AS BEGIN EXIT; END^ CREATE PROCEDURE INITLOG AS BEGIN EXIT; END^ SET TERM ; ^ /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE TABLE ADR ( ID BIGINT NOT NULL, ADR1 VARCHAR(60) CHARACTER SET WIN1252 NOT NULL, ADR2 VARCHAR(60) CHARACTER SET WIN1252, ADR3 VARCHAR(60) CHARACTER SET WIN1252, STREET VARCHAR(60) CHARACTER SET WIN1252, ZIP VARCHAR(10) CHARACTER SET WIN1252, CITY VARCHAR(60) CHARACTER SET WIN1252, STATE VARCHAR(10) CHARACTER SET WIN1252, COUNTRY VARCHAR(60) CHARACTER SET WIN1252 ); CREATE TABLE IBE$DAT ( ID BIGINT NOT NULL, FN VARCHAR(80) CHARACTER SET WIN1252, DAT BLOB SUB_TYPE 0 SEGMENT SIZE 80 ); CREATE TABLE IBE$DB ( ID BIGINT NOT NULL, DB VARCHAR(254) CHARACTER SET WIN1252 ); CREATE TABLE IBE$REPL ( ID BIGINT NOT NULL, USR CHAR(30) CHARACTER SET WIN1252, DB VARCHAR(254) CHARACTER SET WIN1252, SQLSTMT BLOB SUB_TYPE 1 SEGMENT SIZE 80, CRT_TME TIMESTAMP default current_timestamp, RPL_TME TIMESTAMP default null ); /******************************************************************************/ /*** Views ***/ /******************************************************************************/ /* View: IBE$REPL_V */ CREATE VIEW IBE$REPL_V( ID, USR, DB, SQLSTMT, CRT_TME, RPL_TME) AS select r.ID, r.USR, r.DB, r.SQLSTMT, r.CRT_TME, r.RPL_TME from ibe$repl r join ibe$db d on d.db=r.db ; /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE ADR ADD PRIMARY KEY (ID); ALTER TABLE IBE$DAT ADD PRIMARY KEY (ID); ALTER TABLE IBE$DB ADD PRIMARY KEY (ID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: ADR_BI */ CREATE TRIGGER ADR_BI FOR ADR ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(ID,1); END ^ /* Trigger: IBE$REPL_BI */ CREATE TRIGGER IBE$REPL_BI FOR IBE$REPL ACTIVE BEFORE INSERT POSITION 0 as begin if (new.db is null) then select db from ibe$db where id=1 into new.db; end ^ SET TERM ; ^ /******************************************************************************/ /*** Stored Procedures ***/ /******************************************************************************/ SET TERM ^ ; ALTER PROCEDURE DROPLOG AS DECLARE VARIABLE TN VARCHAR(64); DECLARE VARIABLE SQLSTMT VARCHAR(30000); DECLARE VARIABLE ANZ INTEGER; BEGIN FOR --ALLE TABELLEN UND FELDNAMEN RAUSHOLEN, DIE KEINE SYSTEMTABELLEN SIND SELECT DISTINCT R.RDB$RELATION_NAME FROM RDB$RELATIONS R WHERE R.RDB$SYSTEM_FLAG=0 AND NOT R.RDB$RELATION_NAME CONTAINING '$' ORDER BY R.RDB$RELATION_NAME INTO :TN DO BEGIN TN=TRIM(TN); SQLSTMT='DROP TRIGGER '||tn||'_LOGD;'; EXECUTE STATEMENT :SQLSTMT; SQLSTMT='DROP TRIGGER '||tn||'_LOGI;'; EXECUTE STATEMENT :SQLSTMT; SQLSTMT='DROP TRIGGER '||tn||'_LOGU;'; EXECUTE STATEMENT :SQLSTMT; END END ^ ALTER PROCEDURE IBE$REPL_IU ( ID BIGINT, USR CHAR(30) CHARACTER SET WIN1252, DB VARCHAR(254) CHARACTER SET WIN1252, SQLSTMT BLOB SUB_TYPE 1 SEGMENT SIZE 80, CRT_TME TIMESTAMP, RPL_TME TIMESTAMP) AS BEGIN IF (EXISTS(SELECT id FROM IBE$REPL WHERE id=:id)) THEN begin end ELSE INSERT INTO IBE$REPL ( ID, USR, DB, SQLSTMT, CRT_TME, RPL_TME) VALUES ( :ID, :USR, :DB, :SQLSTMT, :CRT_TME, :RPL_TME); END ^ ALTER PROCEDURE INITLOG AS DECLARE VARIABLE TN VARCHAR(64); DECLARE VARIABLE TN_ALT VARCHAR(64); DECLARE VARIABLE FN VARCHAR(64); DECLARE VARIABLE TP INTEGER; DECLARE VARIABLE TRGI VARCHAR(30000); DECLARE VARIABLE TRGU VARCHAR(30000); DECLARE VARIABLE TRGD VARCHAR(30000); DECLARE VARIABLE SQLSTMT VARCHAR(30000); DECLARE VARIABLE TRGIX VARCHAR(2000); DECLARE VARIABLE TRGUX VARCHAR(2000); DECLARE VARIABLE TRGDX VARCHAR(2000); DECLARE VARIABLE SQLF VARCHAR(30000); DECLARE VARIABLE SQLV VARCHAR(30000); DECLARE VARIABLE SQLU VARCHAR(30000); DECLARE VARIABLE ANZ INTEGER; DECLARE VARIABLE L INTEGER; DECLARE VARIABLE P INTEGER; DECLARE VARIABLE S INTEGER; DECLARE VARIABLE FT CHAR(1); BEGIN TN_ALT=''; TRGI=''; TRGU=''; TRGD=''; TRGIX=''; TRGUX=''; TRGDX=''; SQLF=''; SQLV=''; SQLU=''; FT=''; FOR --ALLE TABELLEN UND FELDNAMEN RAUSHOLEN, DIE KEINE SYSTEMTABELLEN SIND SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_NAME, F.RDB$FIELD_TYPE, F.RDB$FIELD_LENGTH, F.RDB$FIELD_PRECISION, F.RDB$FIELD_SCALE FROM RDB$RELATION_FIELDS R, RDB$FIELDS F WHERE R.RDB$SYSTEM_FLAG=0 AND R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME AND NOT R.RDB$RELATION_NAME CONTAINING '$' ORDER BY R.RDB$RELATION_NAME,R.RDB$FIELD_POSITION INTO :TN,:FN,:TP,:L,:P,:S DO BEGIN TN=RTRIM(TN); FN=RTRIM(FN); IF ((TN_ALT<>TN) AND (TN_ALT<>'')) THEN --ACHTUNG, TABELLENWECHSEL BEGIN IF (TRGIX<>'') THEN EXECUTE STATEMENT TRGIX; EXECUTE STATEMENT TRGI; IF (TRGUX<>'') THEN EXECUTE STATEMENT TRGUX; EXECUTE STATEMENT TRGU; IF (TRGDX<>'') THEN EXECUTE STATEMENT TRGDX; EXECUTE STATEMENT TRGD; SQLF=''; SQLV=''; SQLU=''; END -- S=-S; /* TP=7 SHORT TP=8 INTEGER TP=10 FLOAT TP=16 NUMERIC TP=27 DOUBLE PRECISION TP=12 DATE TP=13 TIME TP=35 TIMESTAMP TP=14 CHAR TP=37 VARCHAR */ if ((tp=7) or (tp=8) or (tp=10) or (tp=16) or (tp=27)) then ft='N'; --numerisch else if ((tp=12) or (tp=13) or (tp=35)) then ft='Z'; --zeit else ft='T'; IF (SQLF='') THEN SQLF='INSERT INTO '||TN||'('||FN; ELSE SQLF=SQLF||','||FN; if (ft='N') then begin IF (SQLV='') THEN SQLV= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'' NULL'';ELSE SQLSTMT=SQLSTMT||'' ''||NEW.'||FN||'||'''';'||CRLF(); ELSE SQLV=SQLV||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'',NULL'';ELSE SQLSTMT=SQLSTMT||'',''||NEW.'||FN||'||'''';'||CRLF(); IF (SQLU='') THEN SQLU= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=''UPDATE '||TN||' SET '||FN||'=NULL'';ELSE SQLSTMT=''UPDATE '||TN||' SET '||FN||'=''||NEW.'||FN||'||'''';'||CRLF(); ELSE SQLU=SQLU||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'','||FN||'=NULL'';ELSE SQLSTMT=SQLSTMT||'','||FN||'=''||NEW.'||FN||'||'''';'||CRLF(); end else if (ft='Z') then begin IF (SQLV='') THEN SQLV= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'' NULL'';ELSE SQLSTMT=SQLSTMT||'' ''''''||longstrreplace(longstrreplace(longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿''),'' '',''-''),'':'',''.'')||'''''''';'||CRLF(); ELSE SQLV=SQLV||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'',NULL'';ELSE SQLSTMT=SQLSTMT||'',''''''||longstrreplace(longstrreplace(longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿''),'' '',''-''),'':'',''.'')||'''''''';'||CRLF(); IF (SQLU='') THEN SQLU= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=''UPDATE '||TN||' SET '||FN||'=NULL'';ELSE SQLSTMT=''UPDATE '||TN||' SET '||FN||'=''''''||longstrreplace(longstrreplace(longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿''),'' '',''-''),'':'',''.'')||'''''''';'||CRLF(); ELSE SQLU=SQLU||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'','||FN||'=NULL'';ELSE SQLSTMT=SQLSTMT||'','||FN||'=''''''||longstrreplace(longstrreplace(longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿''),'' '',''-''),'':'',''.'')||'''''''';'||CRLF(); end else begin IF (SQLV='') THEN SQLV= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'' NULL'';ELSE SQLSTMT=SQLSTMT||'' ''''''||longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿'')||'''''''';'||CRLF(); ELSE SQLV=SQLV||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'',NULL'';ELSE SQLSTMT=SQLSTMT||'',''''''||longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿'')||'''''''';'||CRLF(); IF (SQLU='') THEN SQLU= ' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=''UPDATE '||TN||' SET '||FN||'=NULL'';ELSE SQLSTMT=''UPDATE '||TN||' SET '||FN||'=''''''||longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿'')||'''''''';'||CRLF(); ELSE SQLU=SQLU||' IF (NEW.'||FN||' IS NULL) THEN SQLSTMT=SQLSTMT||'','||FN||'=NULL'';ELSE SQLSTMT=SQLSTMT||'','||FN||'=''''''||longstrreplace(LONGTRIM(NEW.'||FN||'),'''''''',''¿'')||'''''''';'||CRLF(); end SELECT COUNT(*) FROM RDB$TRIGGERS WHERE RDB$TRIGGER_NAME=:TN||'_LOGI' INTO :ANZ; IF (ANZ>0) THEN TRGIX='DROP TRIGGER '||TN||'_LOGI'; ELSE TRGIX=''; TRGI='CREATE TRIGGER '||TN||'_LOGI FOR '||TN||' ACTIVE AFTER INSERT POSITION 255 AS '||CRLF()|| 'DECLARE VARIABLE SQLSTMT VARCHAR(30000);'||CRLF()|| 'DECLARE VARIABLE ID BIGINT;'||CRLF()|| 'BEGIN'||CRLF()|| ' ID=GEN_ID(ID,1);'||CRLF()|| ' SQLSTMT='''||SQLF||') VALUES ('';'||CRLF()|| SQLV|| ' SQLSTMT=SQLSTMT||'');'';'||CRLF(); TRGI=TRGI||' IF ((CURRENT_USER<>''REPLICAT'')) THEN INSERT INTO IBE$REPL(ID,USR,SQLSTMT) VALUES (:ID, CURRENT_USER,:SQLSTMT);' ||CRLF(); TRGI=TRGI||'END'; SELECT COUNT(*) FROM RDB$TRIGGERS WHERE RDB$TRIGGER_NAME=:TN||'_LOGU' INTO :ANZ; IF (ANZ>0) THEN TRGUX='DROP TRIGGER '||TN||'_LOGU'; ELSE TRGUX=''; TRGU='CREATE TRIGGER '||TN||'_LOGU FOR '||TN||' ACTIVE AFTER UPDATE POSITION 255 AS '||CRLF()|| 'DECLARE VARIABLE SQLSTMT VARCHAR(30000);'||CRLF()|| 'DECLARE VARIABLE ID BIGINT;'||CRLF()|| 'BEGIN'||CRLF()|| ' ID=GEN_ID(ID,1);'||CRLF()|| SQLU|| ' SQLSTMT=SQLSTMT||'' WHERE ID=''||OLD.ID;' ||CRLF(); TRGU=TRGU||' IF ((CURRENT_USER<>''REPLICAT'')) THEN INSERT INTO IBE$REPL(ID,USR,SQLSTMT) VALUES (:ID, CURRENT_USER,:SQLSTMT);' ||CRLF(); TRGU=TRGU||'END'; SELECT COUNT(*) FROM RDB$TRIGGERS WHERE RDB$TRIGGER_NAME=:TN||'_LOGD' INTO :ANZ; IF (ANZ>0) THEN TRGDX='DROP TRIGGER '||TN||'_LOGD'; ELSE TRGDX=''; TRGD='CREATE TRIGGER '||TN||'_LOGD FOR '||TN||' ACTIVE AFTER DELETE POSITION 255 AS '||CRLF()|| 'DECLARE VARIABLE SQLSTMT VARCHAR(30000);'||CRLF()|| 'DECLARE VARIABLE ID BIGINT;'||CRLF()|| 'BEGIN'||CRLF()|| ' ID=GEN_ID(ID,1);'||CRLF()|| ' SQLSTMT=''DELETE FROM '||TN||' WHERE ID=''||OLD.ID;' ||CRLF(); TRGD=TRGD||' IF ((CURRENT_USER<>''REPLICAT'')) THEN INSERT INTO IBE$REPL(ID,USR,SQLSTMT) VALUES (:ID, CURRENT_USER,:SQLSTMT);' ||CRLF(); TRGD=TRGD||'END'; TN_ALT=TN; END IF (TRGIX<>'') THEN EXECUTE STATEMENT TRGIX; EXECUTE STATEMENT TRGI; IF (TRGUX<>'') THEN EXECUTE STATEMENT TRGUX; EXECUTE STATEMENT TRGU; IF (TRGDX<>'') THEN EXECUTE STATEMENT TRGDX; EXECUTE STATEMENT TRGD; FOR --ALLE TABELLEN UND FELDNAMEN RAUSHOLEN, DIE KEINE SYSTEMTABELLEN SIND SELECT DISTINCT R.RDB$RELATION_NAME FROM RDB$RELATIONS R WHERE R.RDB$SYSTEM_FLAG=0 AND NOT R.RDB$RELATION_NAME CONTAINING '$' ORDER BY R.RDB$RELATION_NAME INTO :TN DO BEGIN TN=RTRIM(TN); SQLSTMT='GRANT ALL ON '||tn||' TO PUBLIC'; EXECUTE STATEMENT :SQLSTMT; END END ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ /* Privileges of users */ GRANT ALL ON ADR TO PUBLIC; GRANT ALL ON IBE$DAT TO PUBLIC; GRANT ALL ON IBE$DB TO PUBLIC; GRANT ALL ON IBE$REPL TO PUBLIC; GRANT ALL ON IBE$REPL_V TO PUBLIC; GRANT EXECUTE ON PROCEDURE DROPLOG TO PUBLIC; GRANT EXECUTE ON PROCEDURE IBE$REPL_IU TO PUBLIC; GRANT EXECUTE ON PROCEDURE INITLOG TO PUBLIC; /* Privileges of triggers */ GRANT SELECT ON IBE$DB TO TRIGGER IBE$REPL_BI; GRANT UPDATE, REFERENCES ON IBE$REPL TO TRIGGER IBE$REPL_BI; /* Privileges of procedures */ GRANT SELECT, INSERT ON IBE$REPL TO PROCEDURE IBE$REPL_IU;