Sybase有一种方法可以让应用程序将数据库连接会话中的“context” data(例如应用程序的最终用户名等)进行通信.上下文数据基本上只是一组键值对,它们通过set_appcontext / get_appcontext存储过程存储/检索.
题:
其他主要数据库服务器(MSSQL / Oracle / MySQL)是否具有将应用程序上下文传递给会话的工具,类似于Sybase的set_appcontext?
细节:
应用程序上下文的一个特定实际用途是当您将具有中间层的应用程序作为非常特定的通用数据库用户连接到数据库时(示例包括用于在Web服务器上运行的Web应用程序后端的“webuser”/“http”或“ myappserver“应用服务器的用户”.
当发生这种情况时,我们仍然希望数据库会话知道END用户(例如使用app客户端的实际用户)是访问控制还是(与我的兴趣更相关),以便审计/历史触发器能够确定哪个最终用户进行了更改并将最终用户信息记录到审计表中.
请注意,信息是在会话级别设置的,这意味着在该会话中执行的任何插入/更新/删除都可以使用上下文数据,而不会将其传递给每个单独的SQL语句 – 这对于,例如,这非常重要一个触发器.
作为一个非常有用的例子,假设你有一个app服务器代表客户端启动数据库会话,你在其中插入/更新/删除5个不同表中的行.您希望为这5个表中的每个表都包含审计表,其中包括“哪个最终用户进行了每次更改”信息.
使用上下文数据,您只需使用触发器从应用程序上下文中检索“最终用户”数据,并将其存储为Audit表记录的一部分.在不使用应用程序上下文的情况下,您需要(1)将“最终用户”列添加到这5个表中的每一个(而不是仅审核表)和(2)将您的应用服务器更改为插入或更新set-set应用程序服务器发出的每个SQL语句中该列的值.哦,如果你要删除一行,这甚至都没有涉及到如何做到这一点.
解决方法:
Oracle有几种不同的方法来实现这一目标.首先,您拥有DBMS_APPLICATION_INFO package.虽然您可以使用它来设置任意上下文信息,但它通常用于跟踪应用程序.您通常会将模块设置为应用程序的名称,并将操作设置为特定业务流程的描述.然后,您可以从V $SESSION引用此信息,并通过V $SESSION_LONGOPS监视长时间运行的操作.
Oracle还可以创建a database object called a context.这是一种更灵活的方式来填充会话级上下文.您可以创建新上下文,然后在该上下文中创建您想要的任何属性.并且您的所有代码都可以简单地引用上下文.例如
SQL> create context my_ctx
2 using pkg_ctx;
Context created.
SQL> create package pkg_ctx
2 as
3 procedure set_context;
4 end;
5 /
Package created.
SQL> create or replace package body pkg_ctx
2 as
3 procedure set_context
4 as
5 begin
6 dbms_session.set_context( 'MY_CTX', 'USERNAME', 'Justin Cave' );
7 end;
8 end;
9 /
Package body created.
SQL> exec pkg_ctx.set_context;
PL/SQL procedure successfully completed.
SQL> select sys_context( 'MY_CTX', 'USERNAME' )
2 from dual;
SYS_CONTEXT('MY_CTX','USERNAME')
-------------------------------------------------------------------------------
Justin Cave