2012-12-01 94 views
4

我试图找出“正确”的方式来建立从我的DataSnap应用程序的服务器到我的数据库的连接。的DataSnap和数据库连接/登录

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

我希望用户从客户端“登陆”,使得这些领域的反映谁已登录的用户(通过扩展,我会从数据库中获取用户身份验证,而不是从服务器)。我能处理的认证服务器本身从客户机确定处理服务器上的OnUserAuthenticate和OnUserAuthorize事件。我试图然后将凭据传递到我的数据库,以便触发器可以正确设置上述字段。

那么,什么是解决这个场景的方式吗?我不知道来自客户端的DSAuthProxyUser和DSAuthProxyPassword可以使用,但我找不到太多(有)我将如何使用该文档。我是否为每个连接用户建立新连接?这对我来说似乎最合乎逻辑。我不会有很多并发用户。上衣30.最有可能5-10。但是,这是做什么“正常”的方式?我不希望(希望我不必)将用户名传递给每个插入/更新以设置表中的值。

我希望我已经解释清楚我的处境。

感谢

回答

2

我还没有使用过,但在我看来,在火鸟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。只要确保你也考虑到没有设置上下文变量的情况(例如管理员直接更改数据库或类似的东西)。

+0

我想人们也可以写'dummy_result = RDB $ SET_CONTEXT( 'USER_SESSION', 'actualuser', '用户的<名')'? – mjn

+0

在PSQL你甚至可以不用来分配根据文档的变量:“由于它的UDF般的性质,RDB $ SET_CONTEXT可以 - 在PSQL唯一的 - 被称为像一个空函数”。但是,从SQL运行时,您需要将其作为针对'RDB $ DATABASE'的查询来执行。 –

+0

完美。谢谢!我可以根据需要做这件事。 – Jason

1

Firebird具有可在SQL中使用的CURRENT_USER关键字。

下面的例子是基于http://www.firebirdsql.org/refdocs/langrefupd15-current_user.html

create trigger bi_customers for customers before insert as 
begin 
    New.created_by = CURRENT_USER; 
end 

要具有更新的用户名,只需更新触发之前声明一个像

create trigger bi_customers for customers before update as 
begin 
    New.updated_by = CURRENT_USER; 
end 

这种解决方案需要一个1:数据库1映射用户到外部用户。在最简单的实现中,这意味着DataSnap会话根据数据库验证用户凭证。

在你的描述然而,它似乎是一个两步鉴别(第一抵靠的DataSnap层,然后对数据库)。我不知道如何能有关安全密码处理来完成的,如果你计划有一个独立的用户名/密码表只用于第一认证阶段(的DataSnap)和的DataSnap用户登录映射到数据库作为某种“脱钩”。

+0

据我明白OP,有数据库连接的用户(这是'CURRENT_USER')和应用程序的逻辑用户之间的差异。 OP想要记录该应用程序的逻辑用户,而不是数据库连接的用户。 –

相关问题