考虑一个触发器,它将id-column设置为on-insert上的Oracle序列(next-)值。现在我想通过一些额外的调试操作来扩展它。但是它们应该只对某些连接/会话(即调试连接)有效。
客户端的伪代码:
服务器端的伪代码(触发器内部):
如何为Oracle数据库实现这样的逻辑?
我应该使用哪些Oracle功能?
答案 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
调用置于触发器中来直接引用上下文。