【问题标题】:PL/SQL LOGOFF TRIGGER does not capture logoff event properlyPL/SQL LOGOFF TRIGGER 未正确捕获注销事件
【发布时间】:2013-04-13 19:59:22
【问题描述】:

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

CREATE TRIGGER logoffTrigger  
BEFORE LOGOFF ON DATABASE  
BEGIN  
INSERT INTO logoffAudit("type","user")VALUES('LOGOFF',USER);  
END;  
/

并使用使用 Oracle.DataAccess.Client 模块的 OracleConnection 对象的小型 VB.Net 应用程序对其进行了测试。虽然 LOGON 事件被类似的 LOGON 触发器正确捕获,但 LOGOOFF 事件仅在客户端连接关闭并且随后关闭整个客户端应用程序时才被捕获,即这还不够:

cn.Close()

这也不是:

cn.Close()  
cn.Dispose()

也不是这个:

cn.Close()  
cn.Dispose()  
cn = Nothing

我做错了什么?在此先感谢,
一月

【问题讨论】:

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

标签: oracle plsql database-trigger


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多