下午好。
我正在尝试为我在 Firebird 中的应用程序开发一个数据库,同时我想在其中实现一些管理用户及其权限的机制(内置于数据库本身对于我的任务来说太复杂了)。
底线很简单:所有对表中数据的应用程序操作都是通过存储过程执行的(只计划 5-6 个表),而所有应用程序用户(以下简称用户)通过一个公共数据库用户与数据库进行操作,该用户具有执行所有 SP 的权利,仅此而已(所有其他必要的权利都授予程序本身)。
同时,每个SP在访问它的时候,通过表单的请求来检查当前用户
select s.user_id from session
left join users u on u.user_id = s.user_id
where (s.session_id = rdb$get_context('USER_SESSION', 'SESSION_ID'))
and (u.enabled = 1)
into :uid;
问题 #1:就运行时而言,每次访问 SP 时检查用户状态有多重要?
或者也许应该简化为
select user_id from session
where session_id = rdb$get_context('USER_SESSION', 'SESSION_ID')
into :uid
, 以及用户是否启用,只检查 USER_LOGIN?..
问题2:从方便和美观的角度来看,我想一般将这段代码(第一个选项)移动到一个单独的SP中,以免在每个SP的开头重复它,比如:
execute procedure get_currentuser returning_values :uid;
但无法在 Firebird 中找到有关嵌套过程调用的详细信息。我想知道这样做有多正确以及它的工作速度有多快或多慢?
PS:可以在此处查看 SESSION 和 USERS 表的大致视图。
问题编号 1。不重要。但如果我们简化,那么
并检查用户状态并将触发器中的会话变量设置为
ON CONNECT或ON TRANSACTION START问题编号 2。嵌套存储效果很好。最好使用它们而不是复制粘贴代码。
PS 在我们的项目中,我们使用您的
get_currentuser. 它检查会话变量,如果它已满,则返回它,如果没有,则发出请求并将结果写入会话变量。