Mysql 是否有一种方法可以将应用程序上下文与非Sybase DB服务器中的DB连接进行通信(类似于Sybase中的set_appcontext)?

Mysql 是否有一种方法可以将应用程序上下文与非Sybase DB服务器中的DB连接进行通信(类似于Sybase中的set_appcontext)?,mysql,sql,oracle,sybase,Mysql,Sql,Oracle,Sybase,Sybase为应用程序提供了一种通信方式,如应用程序的最终用户名等连接到数据库连接会话。上下文数据基本上只是一组键值对,通过set\u appcontext/get\u appcontext存储过程存储/检索 问题: 其他主要数据库服务器(MSSQL/Oracle/MySQL)是否有类似于Sybase的set\u appcontext的将应用程序上下文传送到会话的功能? 详细信息: 应用程序上下文的一个具体实际用途是,当您有一个中间层的应用程序作为一个非常特定的通用数据库用户连接到数据库时(例如

Sybase为应用程序提供了一种通信方式,如应用程序的最终用户名等连接到数据库连接会话。上下文数据基本上只是一组键值对,通过
set\u appcontext
/
get\u appcontext
存储过程存储/检索

问题

其他主要数据库服务器(MSSQL/Oracle/MySQL)是否有类似于Sybase的
set\u appcontext
的将应用程序上下文传送到会话的功能?

详细信息

应用程序上下文的一个具体实际用途是,当您有一个中间层的应用程序作为一个非常特定的通用数据库用户连接到数据库时(例如,对于在web服务器上运行的web应用程序后端,“webuser”/“http”或对于应用程序服务器的“myappserver”用户)

当这种情况发生时,我们仍然希望数据库会话知道最终用户(例如使用应用程序客户端的实际用户)是谁,无论是访问控制还是(与我的兴趣更相关),审计/历史触发器都能够确定是哪位最终用户进行了更改,并将该最终用户信息记录到审计表中

请注意,信息是在会话级别设置的,这意味着在该会话中执行的任何插入/更新/删除都能够使用上下文数据,而无需将其传递给每个SQL语句——这对于触发器来说非常重要

作为一个非常具体的例子来说明它为什么有用,假设您有一个应用程序服务器代表一个客户端启动一个DB会话,在其中插入/更新/删除5个不同表中的行。您希望这5个表中的每一个都有审计表,其中包括“哪些最终用户进行了每次更改”信息


使用上下文数据,您只需使用触发器从应用程序上下文检索“最终用户”数据,并将其存储为审核表记录的一部分。在不使用应用程序上下文的情况下,您需要(1)将“最终用户”列添加到这5个表中的每一个表(而不是仅添加到审核表)和(2)将应用程序服务器更改为在应用程序服务器发出的每个SQL语句中插入或设置或更新该列的值。哦,如果你删除一行的话,这甚至不包括如何做到这一点。

Oracle有几种不同的方法来实现这一点。首先,你有一个。尽管您可以使用它来设置任意上下文信息,但它通常用于跟踪应用程序。您通常会将模块设置为应用程序的名称,将操作设置为特定业务流程的描述。然后,您可以从V$SESSION中引用此信息,并通过V$SESSION\u LONGOPS监视长时间运行的操作

甲骨文也有能力创建。这是一种更灵活的方式来填充会话级上下文。您可以创建一个新的上下文,然后在该上下文中创建您想要的任何属性。您的所有代码都可以简单地引用上下文。比如说

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

对于PostgreSQL,您可以创建一个自定义变量类,它是PostgreSQL.conf中的配置设置。大概是这样的:

custom_variable_classes = 'myvars' 自定义变量类='myvars' (如果我没有弄错的话,设置此选项需要重新启动服务器)

现在,通过SQL,您可以通过以下方式读写:

set myvars.some_flag = 'true'; select current_setting('myvars.some_flag'); 设置myvars.some_标志='true'; 选择当前_设置(“myvars.some_标志”); 请注意,您可以“动态”定义新的“变量”,这些变量的前缀都是
myvars
。单个值不需要在postgresql.conf中声明


最初,这是为附加模块设计的,以允许定义自定义配置选项,因此这是对该功能的一种轻微滥用,但它仍然可以工作。

@OMG Ponies-您是如何解决Oracle中“详细信息”部分中描述的问题的?我们向存储过程提供了用户ID,有效地解决了查询本身的问题。用户ID存储在webapp会话中,在用户登录时保留。很少有表没有审计列——添加了谁的userid&when(日期),更新了谁的userid&when(日期)。@OMG Ponies——如何解决“谁删除了一行”?我所知道的唯一方法是第一次将“who_did”列更新为“who delete”和deletingDelete标志(也称为“soft”delete),其中记录对其他人不可见。CREATE CONTEXT命令似乎位于8.1.7 SQL引用中,因此我假设8i中存在上下文。我不知道他们到底有多久了。谢谢你知道其他人吗?(MySQL/Postgres/DB2)?