是否可以设置用户定义的会话/连接标志以用于触发器?

时间:2013-02-28 21:22:49

标签: sql oracle triggers

考虑一个触发器,它将id-column设置为on-insert上的Oracle序列(next-)值。现在我想通过一些额外的调试操作来扩展它。但是它们应该只对某些连接/会话(即调试连接)有效。

客户端的伪代码:

  • 打开与oracle数据库的连接
  • 仅为该连接设置mydebugflag = yes
  • 插入一些东西
  • 关闭连接

服务器端的伪代码(触发器内部):

  • 设置id = someseq.next_val
  • 如果mydebugflag = yes则{do_some_extra_sanity_checks();诊断();}
  • 其他:已完成

如何为Oracle数据库实现这样的逻辑?

我应该使用哪些Oracle功能?

1 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。

一种是创建一个包,在包中创建一个包全局变量(它将具有会话范围),然后让您的客户端设置包变量并且您的触发器读取它。像

这样的东西
CREATE OR REPLACE PACKAGE pkg_debug_mode
AS
  PROCEDURE set_debug_mode( p_debug_mode IN NUMBER );
  FUNCTION  get_debug_mode
    RETURN  NUMBER;

  DEBUG_MODE_ON  constant number := 1;
  DEBUG_MODE_OFF constant number := 2;
END;

CREATE OR REPLACE PACKAGE BODY pkg_debug_mode
AS
  g_debug_mode NUMBER := DEBUG_MODE_ON;
  PROCEDURE set_debug_mode( p_debug_mode IN NUMBER )
  AS
  BEGIN
    g_debug_mode := p_debug_mode;
  END;
  FUNCTION get_debug_mode
    RETURN NUMBER
  IS
  BEGIN
    RETURN g_debug_mode;
  END;
END;

客户端调用pkg_debug_mode.set_debug_mode设置调试模式,触发器调用pkg_debug_mode.get_debug_mode以确定会话的当前调试模式。

create or replace context my_ctx using pkg_debug_mode;

CREATE OR REPLACE PACKAGE BODY pkg_debug_mode
AS
  PROCEDURE set_debug_mode( p_debug_mode IN NUMBER )
  AS
  BEGIN
    dbms_session.set_context( 'MY_CTX', 'DEBUG_MODE', p_debug_mode );
  END;
  FUNCTION get_debug_mode
    RETURN NUMBER
  IS
  BEGIN
    RETURN SYS_CONTEXT( 'MY_CTX', 'DEBUG_MODE' );
  END;
END;

您的触发器可以调用get_debug_mode函数,也可以通过将SYS_CONTEXT调用置于触发器中来直接引用上下文。