使用者級資料庫結構同步方案(測試版)
工作需要同步兩個使用者的資料庫結構,故寫了一個簡單的資料庫結構同步方案,主要透過觸發器+儲存過程實現,目前還不完善
/*
源資料庫:發出DDL語句的資料庫
目標資料庫:需要與被源資料庫結構同步的資料庫
注意:1)需要顯示授權,如create table ,create index等,最好把使用者擁有的角色對應的系統許可權都顯式授權
2)對由系統自動生成的約束的修改和刪除未實現同步
*/
/*
源資料庫:發出DDL語句的資料庫
目標資料庫:需要與被源資料庫結構同步的資料庫
注意:1)需要顯示授權,如create table ,create index等,最好把使用者擁有的角色對應的系統許可權都顯式授權
2)對由系統自動生成的約束的修改和刪除未實現同步
*/
--在源資料庫建立連線到目標資料庫的DBLINK
----------------------------------------------------------------------------------
create database link LINK_NEW_SUK
connect to SUK identified by SUK
using 'new';
------------------------------------------------------------------------------------
--在目標資料庫的相關使用者下建立儲存DDL語句的表
create table T_DDL
(
DDL_ID NUMBER primary key,
DDL_SQL VARCHAR2(4000) NOT NULL,
DDL_SYSEVENT VARCHR2(100),
DDL_OBJECT_TYPE VARCHAR2(100),
DDL_OBJECT_NAME VARCHAR2(100)
)
------------------------------------------------------------------------------------
--在源資料庫和目標資料庫都建立錯誤記錄表
create table t_sp_err
(
id number primary key,
procedure_name varchar2(200),
err_code number,
err_msg varchar2(400),
inDate date default sysdate,
v_sql varchar2(4000),
V_SYSEVENT VARCHAR2(100),
V_OBJECT_TYPE VARCHAR2(100),
V_OBJECT_NAME VARCHAR2(100)
);
-------------------------------------------------------------------------------------
--在源資料庫和目標資料庫都建立序列
create sequence SEQ_T_SP_ERR
minvalue 1
maxvalue 9999999999999999999
start with 1
increment by 1
cache 20;
----------------------------------------------------------------
--在源資料庫建立序列,只要用來表示DDL的執行順序,否則會出錯
create sequence SEQ_T_DDL_DDL_ID
minvalue 1
maxvalue 9999999999999999999
start with 1
increment by 1
cache 20;
---------------------------------------------------------------------------------------
--在目標資料庫建立儲存過程,執行DDL語句
create or replace procedure p_execute Is
/*
掃描T_DDL表,動態執行SQL,同步資料庫結構
*/
l_errnum Number;
l_errmsg Varchar2(4000);
l_productname Varchar2(200):='p_execute';
l_sql Varchar2(4000);
l_event Varchar2(100);
l_object_type Varchar2(100);
l_object_name Varchar2(100);
begin
For c_sql In (select ddl_event,ddl_object_type,decode(instr(upper(ddl_sql),'TABLESPACE'),0,ddl_sql,
substr(ddl_sql,1,instr(upper(ddl_sql),'TABLESPACE')-1)) ddl_sql from t_ddl) Loop
l_sql:=c_sql.ddl_sql;
l_event:=c_sql.ddl_event;
l_object_type:=c_sql.ddl_object_type;
l_object_name:=ora_dict_obj_name;
If (l_object_type='TABLE' Or l_object_type='INDEX' )And (instr(upper(l_sql),'SYS_')>0) Then
--如果修改表的約束(約束名稱和對應的索引有系統自動生成,則不作處理
Null;
Else
Begin
execute immediate c_sql.ddl_sql;
Exception
When Others Then
l_errnum:=Sqlcode;
l_errmsg:=Sqlerrm;
Insert Into t_sp_err Values(SEQ_T_SP_ERR.Nextval,l_productname,l_errnum,l_errmsg,Sysdate,l_sql,l_event,l_object_type,l_object_name);
Commit;
End;
End If;
end loop;
execute immediate 'truncate table t_ddl';
end p_execute;
-------------------------------------------------------------------------------------
--在源資料庫建立儲存過程,得到DDL語句插入到遠端表
create or replace procedure p_sync_schema(p_sql Varchar2) Is
/*
插入遠端資料表,然後呼叫遠端儲存過程執行DDL
*/
pragma AUTONOMOUS_TRANSACTION;--設定自治事務,避免錯誤ORA_04092
l_errnum Number;
l_errmsg Varchar2(4000);
l_productname Varchar2(200):='p_sync_schema';
l_event Varchar2(100);
l_object_type Varchar2(100);
l_object_name Varchar2(100);
Begin
l_event:=ora_sysevent;
l_object_type:=ora_dict_obj_type;
l_object_name:=ora_dict_obj_name;
insert into values();
p_execute@link_new_suk;
Exception
When Others Then
l_errnum:=Sqlcode;
l_errmsg:=Sqlerrm;
Insert Into t_sp_err Values(SEQ_T_SP_ERR.Nextval,l_productname,l_errnum,l_errmsg,Sysdate,'t',l_event,l_object_type,l_object_name);
Commit;
end p_sync_schema;
--------------------------------------------------------------------------------------------------------------
--建立使用者DDL觸發器
CREATE OR REPLACE TRIGGER tri_ddl AFTER ddl
ON suk.schema
DECLARE
sql_text ora_name_list_t;
state_sql Varchar2(4000);
l_errnum Number;
l_errmsg Varchar2(4000);
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql||sql_text(i);
END LOOP;
p_sync_schema(state_sql);
EXCEPTION
WHEN OTHERS THEN
l_errnum:=Sqlcode;
l_errmsg:=Sqlerrm;
dbms_output.put_line(l_errnum||'£o'||l_errmsg);
END tr_ddl;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63697/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 完善昨天寫的資料庫結構同步方案資料庫
- PostgreSQL:資料庫連結測試SQL資料庫
- DBus資料庫表結構變更處理方案資料庫
- Laravel資料庫測試的另一種方案-SQLiteLaravel資料庫SQLite
- 初級資料結構資料結構
- 資料結構(初級)資料結構
- 資料庫知識整理 - 概述、資料模型、三級模式結構資料庫模型模式
- mysql資料庫-資料結構MySql資料庫資料結構
- 資料結構(python版)資料結構Python
- MySQL 億級資料資料庫最佳化方案測試-銀行交易流水記錄的查詢MySql資料庫
- 大資料測試與 傳統資料庫測試大資料資料庫
- 資料庫測試指南資料庫
- 高併發架構系列:資料庫主從同步的3種方案架構資料庫主從同步
- database資料庫的資料結構Database資料庫資料結構
- Java版-資料結構-棧Java資料結構
- iOS 資料庫升級資料遷移解決方案iOS資料庫
- Java版-資料結構-連結串列Java資料結構
- 測試CMS同步測試CMS同步測試CMS同步
- Linux 資料同步方案Linux
- PHP 單元測試與資料庫測試PHP資料庫
- 2.4. 測試資料庫資料庫
- 資料庫同步資料庫
- clickhouse 億級資料效能測試
- [資料庫]000 - ?Sysbench 資料庫壓力測試工具資料庫
- Java版-資料結構-陣列Java資料結構陣列
- 基本資料結構實現--單連結串列【含測試程式碼】資料結構
- 基本資料結構實現--雙連結串列【含測試程式碼】資料結構
- PostgreSQL 資料庫學習 - 1.資料庫體系結構之儲存結構SQL資料庫
- 在Rainbond中實現資料庫結構自動化升級AI資料庫
- 看得見的資料結構Android版之陣列表(資料結構篇)資料結構Android陣列
- 資料庫結構的優化資料庫優化
- 資料庫索引背後的資料結構資料庫索引資料結構
- android資料庫如何進行版本升級?架構之資料庫框架升級Android資料庫架構框架
- MySQL 資料庫生成 10000 條測試資料MySql資料庫
- oracle測試資料庫啟用Oracle資料庫
- Oracle 閃回資料庫測試Oracle資料庫
- 測試面試(三)--資料庫與linux面試資料庫Linux
- 資料庫面試題總結資料庫面試題