Oracle PL/SQL注销触发器未正确捕获注销事件

Oracle PL/SQL注销触发器未正确捕获注销事件,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我创建了一个这样的注销触发器 CREATE TRIGGER logoffTrigger BEFORE LOGOFF ON DATABASE BEGIN INSERT INTO logoffAudit("type","user")VALUES('LOGOFF',USER); END; / 并使用一个使用Oracle.DataAccess.Client模块的OracleConnection对象的小型VB.Net应用程序对其进行了测试。虽然登录事件由类似的登录触发器正确捕获,但仅

我创建了一个这样的注销触发器

CREATE TRIGGER logoffTrigger  
BEFORE LOGOFF ON DATABASE  
BEGIN  
INSERT INTO logoffAudit("type","user")VALUES('LOGOFF',USER);  
END;  
/
并使用一个使用Oracle.DataAccess.Client模块的OracleConnection对象的小型VB.Net应用程序对其进行了测试。虽然登录事件由类似的登录触发器正确捕获,但仅当客户端连接关闭且整个客户端应用程序随后关闭时,才会捕获注销事件,即,这是不够的:

cn.Close()
这也不是:

cn.Close()  
cn.Dispose()
这也不是:

cn.Close()  
cn.Dispose()  
cn = Nothing
我做错了什么?提前感谢,

Jan

您是否在应用程序中使用连接池?在绝大多数的三层应用程序中,您将在中间层中维护连接池,这样用户就不必在每个页面上等待连接到数据库的重新打开和关闭。当应用程序打开一个连接时,它从池中获取一个现有连接(假设有一个空闲连接),当应用程序关闭一个连接时,它返回到池的连接。虽然这在性能方面非常有效,但使用连接池意味着将应用程序会话与数据库会话分离,因此登录和注销触发器不一定会捕获应用程序登录或注销操作


在您的情况下,我敢打赌,只有在应用程序启动时连接池为空时,登录触发器才会起作用。如果您反复登录和注销,我敢打赌并非所有的应用程序登录都会触发登录触发器。

为什么不使用
AUDIT
?我想对事件执行一些操作,因此无法使用AUDIT。