1

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

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

我究竟做错了什么?在此先感谢,

4

1 回答 1

3

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

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

于 2013-04-13T23:15:56.080 回答