Oracle12c中多宿主环境(CDB&PDB)的数据库触发器(Database Trigger)

时间:2021-04-09 16:49:58

Oracle12c中可插拔数据库(PDBs)上的多宿主数据库触发器

随着多宿主选项的引入,数据库事件触发器可以在CDB和PDB范围内创建。

1.   触发器范围

为了在CDB中创建数据库事件触发器,需要以通用用户登录到数据库,且该用户需要被授予ADMINISTER DATABASETRIGGER系统权限。

CONN sys@cdb1 AS SYSDBA

 

CREATE OR REPLACE TRIGGER cdb1_aftr_strtup_trg

AFTER STARTUP ON DATABASE

BEGIN

  --触发器操作代码

  NULL;

END;

/

为了在PDB中创建一个数据库触发器,需要以通用用户或本地用户连接该数据库,且该用户需要被授予该数据库范围内的ADMINISTER DATABASETRIGGER系统权限。ON DATABASE 和ON PLUGGABLE DATABASE子句在PDB内作用是一样的,但有些事件要求显式的ON PLUGGABLE DATABASE子句。

CONN sys@pdb1 AS SYSDBA

 

CREATE OR REPLACE TRIGGER pdb1_aftr_strtup_trg

AFTER STARTUP ON PLUGGABLE DATABASE

BEGIN

  -- 触发器操作代码

  NULL;

END;

/

 

CREATE OR REPLACE TRIGGER pdb1_aftr_strtup_trg

AFTER STARTUP ON DATABASE

BEGIN

  -- 触发器操作代码

  NULL;

END;

/

有些事件触发器也可以用于CDB和PDB的模式层面。功能并未因多宿主选项而改变。

CONN sys@cdb1 AS SYSDBA

 

CREATE OR REPLACE TRIGGER cdb1_aftr_lgn_trg

AFTER LOGON ON test.SCHEMA

BEGIN

  -- 触发器操作代码

  NULL;

END;

/

 

CONN sys@pdb1 AS SYSDBA

 

CREATE OR REPLACE TRIGGER pdb1_aftr_lgn_trg

AFTER LOGON ON test.SCHEMA

BEGIN

  -- 触发器操作代码

  NULL;

END;

/

2.   可用事件

1)    下列数据库时间均可用于CDB和PDB层面。

ü  AFTER STARTUP :CDB或PDB打开后触发器触发。

ü  BEFORE SHUTDOWN :CDB或PDB关闭前触发器触发。

ü  AFTER SERVERERROR。可用于PDB当服务器错误信息被记录且触发错误触发器安全时触发器将被触发,可用于数据库或模式层面。

ü  AFTER LOGON :当客户端登录到CDB或PDB时触发器触发,可用于数据库或模式层面。

ü  BEFORE LOGOFF:客户端退出CDB或PDB时触发,可用于数据库或模式层面。

ü  AFTER SUSPEND :当服务器错误引起事务暂停时触发器触发,可用于数据库或模式层面。

ü  BEFORE SET CONTAINER:SET CONTAINER命令执行前触发器触发,可用于数据库或模式层面。

ü  AFTER SET CONTAINER:SET CONTAINER命令执行后触发器触发,可用于数据库或模式层面。

2)    下列数据库事件仅用于CDB层面。

ü  AFTER DB_ROLE_CHANGE:在DG配置环境中,当数据库角色从主库切换为备库或从备库切换为主库时触发。

3)    下列数据库事件只能用于PDB层面,且要求显式的ON PLUGGABLEDATABASE子句,使用ON DATABASE子句会导致报错。

ü  AFTER CLONE :克隆操作完成后,触发器就在新PDB中触发,且随后该触发器被删除。如果触发器失败,克隆操作也会失败。

ü  BEFORE UNPLUG :在去插拔操作前,触发器在PDB中触发,且随后该触发器被删除。如果触发器失败,去插拔操作也将失败。