0

考虑一个将 id 列设置为插入时 Oracle 序列(下一个)值的触发器。现在我想用一些额外的调试操作来扩展它。但它们应该只对某些连接/会话(即调试会话)有效。

客户端的伪代码:

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

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

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

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

我应该为此使用哪些 Oracle 功能?

4

1 回答 1

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调用放入触发器中直接引用上下文。

于 2013-02-28T21:48:22.450 回答