我创建了一个像这样的LOGOFF触发器
CREATE TRIGGER logoffTrigger
BEFORE LOGOFF ON DATABASE
BEGIN
INSERT INTO logoffAudit("type","user")VALUES('LOGOFF',USER);
END;
/
并使用一个小型VB.Net应用程序对其进行测试,该应用程序使用Oracle.DataAccess.Client模块的OracleConnection对象。虽然通过类似的LOGON触发器正确捕获了LOGON事件,但只有当客户端连接关闭且整个客户端应用程序关闭后才会捕获LOGOFF事件,即这还不够:
cn.Close()
也不是这样:
cn.Close()
cn.Dispose()
也不是:
cn.Close()
cn.Dispose()
cn = Nothing
我做错了什么?提前谢谢,
扬
答案 0 :(得分:3)
您是否在应用程序中使用连接池?在浩大大多数三层应用程序中,您将在中间层维护一个连接池,以便用户不必在每个页面上等待与数据库的连接打开和关闭再次。当应用程序打开连接时,它从池中获取现有连接(假设存在空闲连接),并且当应用程序关闭连接时,它将返回到池的连接。虽然这在性能方面效率更高,但使用连接池意味着您将应用程序会话与数据库会话分离,因此登录和注销触发器不一定会捕获应用程序登录或注销操作。
在您的情况下,我的赌注是登录触发器似乎仅在应用程序启动时连接池为空时才起作用。如果您反复登录和注销,我会打赌并非所有应用程序登录都会导致登录触发器触发。