gpt4 book ai didi

mysql - 有没有一种方法可以将应用程序上下文传递给非 Sybase 数据库服务器中的数据库连接(类似于 Sybase 中的 set_appcontext)?

转载 作者:可可西里 更新时间:2023-11-01 07:23:51 24 4
gpt4 key购买 nike

Sybase 有一种应用程序通信方式"context" data - 例如应用程序的最终用户名等。 - 数据库连接 session 。上下文数据基本上只是一组键值对,通过 set_appcontext/get_appcontext 存储过程存储/检索。

问题:

其他主要数据库服务器 (MSSQL/Oracle/MySQL) 是否有类似于 Sybase 的 set_appcontext 将应用程序上下文传递给 session 的工具?

详细信息:

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

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

请注意,该信息是在 session 级别设置的,这意味着在该 session 中执行的任何插入/更新/删除都能够使用上下文数据,而无需将其传递给每个单独的 SQL 语句 - 这对于,比如说,一个触发器。

作为它为什么有用的一个非常具体的示例,假设您有一个应用服务器代表一个客户端启动数据库 session ,您在其中插入/更新/删除 5 个不同表中的行。您希望为这 5 个表中的每一个创建审计表,其中包括“哪个最终用户进行了每次更改”信息。

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

最佳答案

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

Oracle 也有能力创建a database object called a context .这是填充 session 级上下文的更灵活的方法。您可以创建一个新的上下文,然后在该上下文中创建您想要的任何属性。您的所有代码都可以简单地引用上下文。例如

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

关于mysql - 有没有一种方法可以将应用程序上下文传递给非 Sybase 数据库服务器中的数据库连接(类似于 Sybase 中的 set_appcontext)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com