如何实现trigger集中记录所有库ddl操作

今天客户说了一个我感觉有意思的需求:在一个库上的一张表记录所有库的ddl操作,实现方式:在一个库上建立表和触发器,其他库上通过dblink+同义词+触发器实现ddl操作记录到远程的表中.他当时写了一个触发器,但是有错误,想让我协助解决.在我们的一起努力下,解决了该触发器在dblink同义词的库上出错的问题.我这里测试使用的是10g的库做为存储所有库的ddl记录的库,11g库做为一个通过dblink插入ddl操作记录的库.

在10g数据库库中操作

1.创建记录ddl操作表

SQL> conn chf/xifenfei

Connected.

SQL> create table t_ddl_audit(

2  db_name varchar2(30),

3  login_user varchar2(30),

4  ddl_time date,

5  ip_address varchar2(20),

6  audsid varchar2(20),

7  schema_user varchar2(30),

8  schema_object varchar2(40),

9  login_tool varchar2(40),

10  os_user varchar2(40),

11  ddl_sql varchar2(4000));

Table created.

2.创建触发器

SQL> create or replace trigger tri_ddl_audit

2    before ddl on database

3  declare

4    n           number;

5    str_stmt    varchar2(4000);

6    sql_text    ora_name_list_t;

7    l_trace     number;

8    v_module    varchar2(50);

9    v_action    varchar2(50);

10    str_session v$session%rowtype;

11  begin

12    n := ora_sql_txt(sql_text);

13    for i in 1 .. n loop

14      str_stmt := substr(str_stmt || sql_text(i), 1, 3000);

15    end loop;

16    dbms_application_info.READ_MODULE(v_module, v_action);

17    INSERT INTO chf.t_ddl_audit

18      (db_name,

19       login_user,

20       ddl_time,

21       ip_address,

22       audsid,

23       schema_user,

24       schema_object,

25       login_tool,

26       os_user,

27       ddl_sql)

28    VALUES

29      (sys_context('USERENV', 'db_name'),

30       ora_login_user,

31       SYSDATE,

32       sys_context('USERENV', 'IP_ADDRESS'),

33       userenv('SESSIONID'),

34       ora_dict_obj_owner,

35       ora_dict_obj_name,

36       v_module,

37       sys_context('userenv', 'os_user'),

38       str_stmt);

39  exception

40    when no_data_found then

41      null;

42  end;

43  /

Trigger created.

3.测试触发器

SQL> conn chf/xifenfei

Connected.

SQL> create table t_xff as select * from dba_tables where rownum=1;

Table created.

SQL> select db_name,login_user,ddl_sql from t_ddl_audit;

DB_NAME                        LOGIN_USER

------------------------------ ------------------------------

DDL_SQL

-----------------------------------------------------------------

XFF                            CHF

create table t_xff as select * from dba_tables where rownum=1

在11g数据库中操作

1.创建dblink和同义词

SQL> create database link "ora10g_dblink"

2   connect to chf

3    identified by "xifenfei"

4     using 'ora10g';

Database link created.

SQL> create  synonym t_ddl_audit for t_ddl_audit@ora10g_dblink;

Synonym created.

2.第一次创建触发器

SQL> create or replace trigger tri_ddl_audit

2    before ddl on database

3  declare

4    n           number;

5    str_stmt    varchar2(4000);

6    sql_text    ora_name_list_t;

7    l_trace     number;

8    v_module    varchar2(50);

9    v_action    varchar2(50);

10    str_session v$session%rowtype;

11  begin

12    n := ora_sql_txt(sql_text);

13    for i in 1 .. n loop

14      str_stmt := substr(str_stmt || sql_text(i), 1, 3000);

15    end loop;

16    dbms_application_info.READ_MODULE(v_module, v_action);

17    INSERT INTO t_ddl_audit

18      (db_name,

19       login_user,

时间: 2024-10-30 13:03:38

如何实现trigger集中记录所有库ddl操作的相关文章

[MySQL Bug]DDL操作导致备库复制中断

----------------- 在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住.这会导致如下问题(MySQL bug#989) master: 未提交的事务,但SQL已经完成(binlog也准备好了),表schema发生更改,在commit的时候不会被察觉到. slave: 在binlog里是以事务提交顺序记录的,DDL隐式提交,因此在备库先执行DDL,后执行事务trx,由于trx作用

Oracle记录用户DDL操作的脚本

--当前普通用户创建 issgzt create table TAB_DDL ( LOGIN_USER VARCHAR2(60), AUDSID NUMBER, MACHINE VARCHAR2(60), IPADDRESS VARCHAR2(20), SCHEMA_USER VARCHAR2(60), SCHEMA_OBJECT VARCHAR2(60), DDL_TIME DATE, DDL_SQL VARCHAR2(4000), MODULE VARCHAR2(100), SCHEMA_O

如何使用触发器实现数据库级守护,防止DDL操作

触发器|数据|数据库      如何使用触发器实现数据库级守护,防止DDL操作 --对于重要对象,实施DDL拒绝,防止create,drop,truncate,alter等重要操作 Last Updated: Sunday, 2004-10-31 12:06 Eygle        不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失. 通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作. 以下是一个简单的范例,供参

使用开源库 MagicalRecord 操作 CoreData

MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data 是 ORM 方案,据说带来的麻烦比好处多,且 Core Data 建立的表没有主键,但对于对数据库没有性能要求,进行简单的数据操作完全够用,能简化无数的代码量. MagicalRecord In software engineering, the active record pattern is a

Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

1.  Hive基本操作 1.1  DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type[COMMENT col_comment], ...)] +    [COMMENT table_comment]    [PARTITIONED BY (col_namedata_type [COMMENT col_comment], ...)]    [CLUST

MS SQL监控数据库的DDL操作

    前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理起来就会相当麻烦,容易产生混乱,如果数据库管理员不监控数据库架构变更的话,就不知道谁对数据库架构做了啥改动(此处改动仅仅只DDL操作),尤其有时候,有些开发人员可能不按规章制度办事,绕过或忘了通知发布人员或DBA,直接去生产机做一些DDL操作,那么我们就需要对数据库架构某些更改的事件进行监控,

LVS+Keepalived实现MySQL从库读操作负载均衡

说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.126 MySQL从服务器:192.168.21.127,192.168.21.128 MySQL主从同步的数据库为:osyunweidb 实现目的: 增加两台服务器(主备),通过LVS+Keepalived实现MySQL从库读操作负载均衡 架构规划: 操作系统:CentOS 5.X 64位 LVS主服务器:192.168.21.129 LVS备服务器:192.168.21.130 LVS虚拟服务器(VIP

MSSQL监控数据库的DDL操作(创建,修改,删除存储过程,创建,修改,删除表等)_MsSql

前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理起来就会相当麻烦,容易产生混乱,如果数据库管理员不监控数据库架构变更的话,就不知道谁对数据库架构做了啥改动(此处改动仅仅只DDL操作),尤其有时候,有些开发人员可能不按规章制度办事,绕过或忘了通知发布人员或DBA,直接去生产机做一些DDL操作,那么我们就需要对数据库架构某些更改的事件进行监控,如果能够

mysql基础之对库表操作

原文:mysql基础之对库表操作 查看一下所有的库,怎么办? Mysql>Show databases;   选库语句: Use 库名 创建一个数据库: create database 数据库名 [charset 字符集] 删除一个数据库: drop database 数据库名; 把数据库改改名? Mysql中,表/列可以改名,database不能改名. phpMyAdmin似乎有这功能? 他是建新库,把所有表复制到新库,再删旧库完成的. 当选了库之后,我们面对的是表 查看库下面的所有表: sh