gpt4 book ai didi

delphi - DataSnap 和数据库连接/登录

转载 作者:行者123 更新时间:2023-12-03 15:30:58 28 4
gpt4 key购买 nike

我正在尝试找出“正确”的方法来从 DataSnap 应用程序的服务器建立到数据库的连接。

数据库中的每个(大多数)表都有名为“Updated”和“Created”(这是写入记录时的当前时间戳)的字段(其值通过插入和更新时的触发器设置)以及“updated_by”和“created_by” (应该)包含当前登录的用户。

我希望用户从客户端“登录”,以便这些字段反射(reflect)已登录的用户(并且通过扩展,我将从数据库而不只是从服务器获得用户身份验证)。我可以从客户端处理对服务器本身的身份验证,并处理服务器上的 OnUserAuthenticate 和 OnUserAuthorize 事件。然后我尝试将凭据传递到我的数据库,以便触发器可以正确设置上述字段。

那么处理这种情况的方法是什么?我想知道是否可以使用客户端的 DSAuthProxyUser 和 DSAuthProxyPassword,但我找不到太多(任何)有关如何使用它的文档。我是否为每个连接的用户建立一个新连接?这对我来说似乎最合乎逻辑。我不会有很多并发用户。前 30 名。最有可能是 5-10 名。但这样做的“正常”方式是什么?我不想(希望我不必)将用户名传递给每个插入/更新以设置表中的值。

我希望我已经清楚地解释了我的情况。

谢谢

最佳答案

我还没有使用过它,但在我看来 RDB$SET_CONTEXT()RDB$GET_CONTEXT() Firebird 2 中介绍的正是您所需要的。使用这些函数,您可以设置(并获取)特定于用户 session (命名空间USER_SESSION)或当前事务(命名空间USER_TRANSACTION)的附加信息。您还可以检索当前 session (命名空间 SYSTEM)的其他系统信息,但这可能与您的情况无关。

您需要做的是在 OnUserAuthorize 事件中调用 RDB$SET_CONTEXT() 方法,例如使用(作为查询):

SELECT RDB$SET_CONTEXT('USER_SESSION', 'actualuser', '<name of user') 
FROM RDB$DATABASE

这里'actualuser'是我们使用的上下文变量。然后,您可以在触发器中检索名称(假设 PSQL,带有声明的变量 actualuser)

actualuser = RDB$GET_CONTEXT('USER_SESSION', 'actualuser');

然后,您可以在触发器的其余部分中使用 actualuser。只需确保您还考虑了未设置上下文变量的情况(例如,管理员直接更改数据库或类似的操作)。

关于delphi - DataSnap 和数据库连接/登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13657003/

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