oracle中触发器有啥作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中触发器有啥作用相关的知识,希望对你有一定的参考价值。

。触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好的了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
具体举例:
1.
在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
2.
在一个表吕定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。
不知这样讲述可否清楚了呢?
参考技术A 触发器是个特殊的
存储过程
,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行update,delete,操作时就会激活它执行,如例子:create
or
replace
trigger
tigger_select_update
before
update
or
delete
on
mytable
for
each
row
declare
begin
if
:old.name='1'
then
raise_application_error(-20001,'不允许删除和修改');
dbms_output.put_line('load......');
end
if;
end;

Oracle Forms:预删除触发器中的警报不起作用

【中文标题】Oracle Forms:预删除触发器中的警报不起作用【英文标题】:Oracle Forms: alert in pre-delete trigger not working 【发布时间】:2016-12-21 11:04:30 【问题描述】:

我有一个包含 4 列的表 OBJECTS:id、type_id、type_desc 和 state_id。

如果 state_id 是“DELETE”,我想中止删除行并显示一条警告消息,提示“您无法删除此行”。 这是 PRE_DELETE 触发器:

begin
  if :OBJECTS.state_id = 'DELETE' then
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');

    if show_alert('ALERT_DEL') = alert_button1 then
      null;
    end if;

    raise FORM_TRIGGER_FAILURE;
  end if;
end;

很遗憾,警报消息不会显示。

编辑: 我之前忘了提这个: Oracle Forms 返回错误 FRM-40741: Unable to locate record 0 on block OBJECTS。

编辑: 我也在尝试做一个 PRE-UPDATE 触发器:

declare 
  stateID varchar2(10);
  pressed_button number(2,0);
  info number(2,0);
begin
  stateID := get_item_property(:OBJECTS.state_id, DATABASE_VALUE);

  set_alert_property('ALERT_INFO',alert_message_text,'STATE_ID: ' || stateID);
  info := show_alert('ALERT_INFO');

  if stateID = 'DELETE' then
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');
    pressed_button := show_alert('ALERT_EDIT');
    raise FORM_TRIGGER_FAILURE;
  end if;

end;

我收到错误 FRM-40105:无法解析对项目 DELETE 的引用。 所以我创建了 ALERT_INFO 警报来显示存储在数据库中的 state_id 的值。我什么也没显示。我做错了什么?

【问题讨论】:

【参考方案1】:

没有要测试的表单,但在 IF 语句中使用 SHOW_ALERT() 看起来,嗯,不确定。试试这个:

declare
  pressed_button number(2,0);
begin
  if :OBJECTS.state_id = 'DELETE' then
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');

   pressed_button := show_alert('ALERT_DEL');

    raise FORM_TRIGGER_FAILURE;
  end if;
end;

您可以在pressed_button 上添加一个测试以查看实际按下了哪个按钮,但这似乎对您发布的代码没有任何影响。

【讨论】:

【参考方案2】:

您的代码似乎没问题。如果我在 PRE-DELETE 触发器中尝试简化代码

begin
    if show_alert('ALERT_DEL') = alert_button1 then
      raise form_trigger_failure;
    end if;
end;

它像预期的那样工作(Oracle Forms 6i)。

我猜你的 :OBJECTS.state_id 不是 'DELETE'。

编辑:FRM-40741 - 就是这样!问题在线

set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');

您尝试设置已删除记录的可视属性,在您的情况下,CURRENT_RECORD 变量设置为 0。

不要为您的任务使用 PRE-DELETE 触发器。在 OBJECTS 块的 WHEN-NEW-RECORD-INSTANCE 触发器中禁用记录删除:

if :OBJECTS.state_id = 'DELETE' then
    set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_FALSE);
else
    set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_TRUE);
end if;

【讨论】:

以上是关于oracle中触发器有啥作用的主要内容,如果未能解决你的问题,请参考以下文章

创建oracle系统事件触发器需要有啥权限,scott用户创建不了。

寄存器有啥作用

sqlserver 中创建触发器execute master有啥作用

如果触发器中的语句不起作用 SQL(Oracle)

触发器中的 ORACLE SQL 更新语句在 2 行后不起作用

Oracle Forms:预删除触发器中的警报不起作用