每次打开与数据库的新连接时,是否可以执行查询。此查询需要在打开数据库连接后立即运行,因为此查询调用存储过程,该存储过程使用请求运行查询的用户的详细信息在表上设置各种访问控制。我试图在不同的地方调用这个存储过程,它们都很成功,但我想要一些反馈。
我已将此查询放在其他映射器扩展的抽象映射器类中。每次实例化新的映射器时,都会调用存储过程。
将此调用放到存储过程的另一个地方是在调用其他映射器方法之前。这样做的缺点是会有很多重复的代码(调用存储过程的代码)。
此调用的最终位置在 Bootstrap.php 中。每个加载应用程序时,此文件中的每个 _init 方法都只运行一次。我决定将这个调用放在其中一个 Bootstrap.php 中的存储过程中。到目前为止,这是我能想到的最佳位置,因为我只需编写一次调用存储过程的代码,每次访问应用程序时都会运行initialize方法。这样做的缺点是我不知道把东西放在 Bootstrap.php 中的副作用。
所有这些地方的一个主要缺点是存储过程被多次调用。要使访问控制起作用,每个数据库会话只需调用一次存储过程。由于不必要的呼叫,这不会导致速度以外的任何问题。
有没有更好的地方将此调用放入存储过程? Zend FM是否在某处实现了此功能?如果我把它放在 Bootstrap 文件中,有什么我需要考虑的。
感谢您阅读此内容以及提供的任何帮助。
答案 0 :(得分:1)
作为替代方法,您可以通过将database configuration parameter connect_proc
设置为存储过程的名称来在数据库端配置它。请注意,然后将为所有远程和本地连接调用该过程,包括由数据库管理员进行的连接。
如果您需要将额外信息从客户端传递到connect_proc
例程,您可以使用client accounting string connection parameter,然后您可以使用MON_GET_CONNECTION()
function在该过程中阅读:
SET acct_string = (
SELECT client_acctng FROM TABLE (
MON_GET_CONNECTION(MON_GET_APPLICATION_HANDLE(),-1)
)
)