2016-11-18 84 views
0

是否有可能在每次打开数据库的新连接时执行查询。此查询需要在打开数据库连接后立即运行,因为此查询调用一个存储过程,该存储过程使用请求运行查询的用户的详细信息在表上设置各种访问控制。我试图在各个地方调用这个存储过程,它们都是成功的,但我希望得到一些反馈。每次打开数据库连接时运行查询Zend FM

我已经把这个查询放在其他映射器扩展的抽象映射器类中。每次新实例化映射器时,都会调用存储过程。

将此调用存储过程的另一个地方是调用其他映射器方法之前。这样做的缺点是会有很多重复的代码(调用存储过程的代码)。

把这个电话放在最后的地方是Bootstrap.php。这个文件中的每个_init方法假设每次加载应用程序时只运行一次。我已决定将此调用存储在Bootstrap.php之一的存储过程中,以供我们的其中一个模块使用。这是迄今为止我能想到的最好的地方,因为我只需编写一次调用存储过程的代码,并且每次访问应用程序时,都会运行initialize方法。这样做的缺点是我不知道把东西放在Bootstrap.php的副作用。

所有这些地方的主要缺点之一是存储过程被调用很多次。为了使访问控制起作用,每个数据库会话只需要调用一次存储过程。由于不必要的呼叫,这不会导致速度以外的任何问题。

有没有更好的地方把这个调用存储过程? Zend FM是否在某处实现了此功能?如果我把它放在Bootstrap文件中,有什么需要考虑的。

感谢您阅读本文以及提供的任何帮助。

  • DB2版本10.5
  • Linux平台
  • Zend的FM版本2
+0

请注明DB2版本和平台。 – mustaccio

回答

1

作为替代方案,您可以在数据库方面由database configuration parameter connect_proc设置为存储过程的名称,配置此。请注意,该过程将针对所有远程和本地连接进行调用,包括数据库管理员所做的所有连接。

如果您需要从客户端传递额外的信息给connect_proc程序,你可以使用MON_GET_CONNECTION() function使用client accounting string connection parameter,然后你可以在程序中阅读:

SET acct_string = (
    SELECT client_acctng FROM TABLE (
    MON_GET_CONNECTION(MON_GET_APPLICATION_HANDLE(),-1) 
) 
) 
+0

该文档说只有具有0个参数的程序可以用作连接程序。这是行不通的,因为我们为我们的程序提供了两件事。 –