我希望在Oracle启动时执行一个过程

时间:2018-03-14 19:14:14

标签: oracle startup

当我启动Oracle实例时,是否有可能让Oracle在初始化期间运行一些PL / SQL?

我试图在网上找到一些东西,但我的搜索效果不佳。

更具体地说,

如果我发出

$ sqlplus ....
startup mount;
alter database open;

我可以让它然后运行PL / SQL程序吗?

2 个答案:

答案 0 :(得分:5)

您正在寻找启动后启动触发器。

参考:https://docs.oracle.com/database/121/LNPLS/create_trigger.htm#LNPLS01374

CREATE TRIGGER my_on_open_trigger
AFTER STARTUP ON DATABASE
BEGIN
     <<< DO SOMETHING >>>
END my_on_open_trigger;
/

答案 1 :(得分:0)

克里斯赖斯说(在评论中讨论触发器的触发顺序):

  

我不认为可以设置顺序,这是折叠的真正原因   尽可能为1

你认为错了:)

从Oracle 11g开始,有一个FOLLOWS选项可以让你设置这样的东西。这是一个例子:

SQL> create table test (id varchar2(10));

Table created.

SQL> create or replace trigger t1
  2    before insert on test
  3    for each row
  4  begin
  5    dbms_output.put_Line('trigger 1');
  6  end;
  7  /

Trigger created.

SQL> create or replace trigger t2
  2    before insert on test
  3    for each row
  4    follows t3
  5  begin
  6    dbms_output.put_Line('trigger 2');
  7  end;
  8  /

Warning: Trigger created with compilation errors.

SQL> create or replace trigger t3
  2    before insert on test
  3    for each row
  4    follows t1
  5  begin
  6    dbms_output.put_Line('trigger 3');
  7  end;
  8  /

Trigger created.

SQL> insert into test values ('A');
trigger 1
trigger 3
trigger 2

1 row created.

SQL>

附注:触发器T2创建时出现错误,因为我说它跟随T3,在T2创建期间不存在。最后,所有这些都是有效的:

SQL> select object_name, status
  2  from user_objects
  3  where object_name in ('T1', 'T2', 'T3')
  4    and object_type = 'TRIGGER';

OBJECT_NAME          STATUS
-------------------- -------
T3                   VALID
T2                   VALID
T1                   VALID

SQL>

[编辑,关于AFTER STARTUP触发器]

我在SYS架构中创建了触发器,类似于我之前发布的3个:

SQL> create table test (id number);

Table created.

SQL> create or replace trigger t1
  2  after startup on database
  3  begin
  4    insert into test values (1);
  5  end;
  6  /

Trigger created.

SQL> create or replace trigger t2
  2  after startup on database
  3  follows t3
  4  begin
  5    insert into test values (2);
  6  end;
  7  /

Warning: Trigger created with compilation errors.

SQL> create or replace trigger t3
  2  after startup on database
  3  follows t1
  4  begin
  5    insert into test values (3);
  6  end;
  7  /

Trigger created.

关闭我的XE,启动它,检查那里有什么:

SQL> show user
USER is "SYS"
SQL> select * From test;

        ID
----------
         1
         2
         3

布拉赫!真的,它不像我想的那样有效。

哦,我错了&amp;向你们所有人道歉。