当前位置 : 主页 > 编程语言 > delphi >

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

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在尝试以“正确”的方式从我的DataSnap应用程序的服务器建立与数据库的连接. 数据库中的每个(大多数)表都有字段(其值通过插入和更新时的触发器设置),称为Updated和Created(这是写入
我正在尝试以“正确”的方式从我的DataSnap应用程序的服务器建立与数据库的连接.

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

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

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

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

谢谢

我还没有使用它,但在我看来Firebird 2中引入的 RDB$SET_CONTEXT()RDB$GET_CONTEXT()就是你所需要的.使用此方法,您可以设置(并获取)特定于用户会话(名称空间USER_SESSION)或当前事务(名称空间USER_TRANSACTION)的其他信息.您还可以检索当前会话(命名空间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.只需确保您还考虑未设置上下文变量的情况(例如,管理员直接更改数据库或类似的内容).

网友评论