Sybase 有一种让应用程序进行通信的方法“上下文”数据 http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sag/@Generic__BookTextView/38861;hf=0- 例如应用程序的最终用户名等。 - 数据库连接会话。上下文数据基本上只是一组键值对,通过以下方式存储/检索set_appcontext
/get_appcontext
存储过程。
QUESTION:
其他主要数据库服务器(MSSQL/Oracle/MySQL)是否具有类似于 Sybase 的将应用程序上下文与会话进行通信的功能set_appcontext
?
Details:
应用程序上下文的一个具体实际用途是,当您有一个具有中间层的应用程序作为非常特定的通用数据库用户连接到数据库时(示例包括“webuser”/“http”,用于在 Web 服务器上运行的 Web 应用程序后端或“ myappserver”应用程序服务器的用户)。
当发生这种情况时,我们仍然希望数据库会话知道最终用户(例如使用应用程序客户端的实际用户)是谁,无论是为了访问控制还是(与我的兴趣更相关),以便审计/历史触发器能够确定哪个最终用户进行了更改并将该最终用户信息记录到审核表中。
请注意,该信息是在会话级别设置的,这意味着在该会话中执行的任何插入/更新/删除都能够使用上下文数据,而无需将其传递给每个单独的 SQL 语句 - 这对于以下情况非常重要:一个触发器。
作为一个非常具体的示例来说明它的有用性,假设您有一个应用程序服务器代表客户端启动数据库会话,您可以在其中插入/更新/删除 5 个不同表中的行。您希望为这 5 个表中的每一个建立审计表,其中包括“哪个最终用户进行了每个更改”信息。
使用上下文数据,您可以使用触发器从应用程序上下文中检索“最终用户”数据并将其存储为审核表记录的一部分。如果不使用应用程序上下文,您将需要 (1) 将“最终用户”列添加到这 5 个表中的每一个(而不是仅审核表)以及 (2) 将您的应用程序服务器更改为插入或更新时设置应用程序服务器发出的每个 SQL 语句中该列的值。哦,这甚至没有涉及如何做到这一点,如果你是deleting a row.
Oracle 有几种不同的方法来实现这一点。首先,你有DBMS_APPLICATION_INFO 包 http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_appin2.htm。尽管您可以使用它来设置任意上下文信息,但它通常用于跟踪应用程序。您通常会将模块设置为应用程序的名称,并将操作设置为特定业务流程的描述。然后,您可以从 V$SESSION 引用此信息,并通过 V$SESSION_LONGOPS 监视长时间运行的操作。
Oracle 还具有创建称为上下文的数据库对象 http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_5002.htm。这是填充会话级上下文的更灵活的方法。您可以创建一个新上下文,然后在该上下文中创建您想要的任何属性。您的所有代码都可以简单地引用上下文。例如
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)