【问题标题】:Looking for tips on debugging Oracle row-level security functions寻找调试 Oracle 行级安全功能的技巧
【发布时间】:2011-04-21 22:47:11
【问题描述】:

我正在寻找在 Oracle 数据库中调试我的一些行级安全谓词的技巧。这些谓词使用一些概念来确定当前用户是否可以看到记录:

  • 当前用户的 Oracle 用户名
  • 为当前用户分配的 Oracle 角色
  • 当前用户与一个或多个表中的记录的从属关系

我无法在真实数据上调试这种事情,因为我想不出一个好的方法来模拟实际看到特定用户可以看到的内容。所以,我正在寻找提示。这种东西有好的基础框架吗?

这是我的一个谓词的示例:

predicate := 'project_id in (' ||
    '(select upr.projectid project_id ' ||
    'from  chemreg.usergroups_projects_vu upr, ' ||
    '      chemreg.usergroups_personnel_vu upe, ' ||
    '      chemreg.personnel pe ' ||
    'where upr.usergroupid = upe.usergroup_id ' ||
    '      and upe.personnel_id = pe.person_id ' ||
    '      and upper(pe.username) = USER) ' ||
    'union ' ||
    '(select project_id from chemreg.project ' ||
    'where active = ''Y'' and private = ''N'' ) )';

【问题讨论】:

    标签: oracle debugging row-level-security


    【解决方案1】:

    如果您想弄清楚为什么有些行不应该出现,和/或为什么有些行在应该出现的时候却没有出现,试试这个:

    1. 删除所有行级安全谓词。
    2. 运行查询,但手动添加行级安全谓词。
    3. 检查结果。

    然后,您可以轻松地逐个更改谓词(例如,注释掉各个位),直到找出它们给出意外结果的原因。

    【讨论】:

    • 我想复杂的事情是当前的用户上下文。所以,如果我的谓词加入了一些像 user_role_privs 这样的视图,那么我仍然没有得到全貌,除非我真的以那个人的身份登录。我想我在模拟实际用户的环境时遇到了更多麻烦。我知道我可以创建具有正确角色等的测试用户,但正是用户、他们的数据和他们的角色之间的关系——整个包——让我觉得很棘手。我一直在做的是找到一个愿意让我更改密码并以他们身份登录几个小时的用户。
    • 您是在询问用户的密码吗?你不是在生产中调试吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多