我正在使用 Microsoft Reporting Services 2008。在我们的数据库中,我们有一小群机密学生需要考虑几个查询。如果他们是机密学生,则数据库基本上不需要返回任何内容。目前,我们按照以下方式做一些事情:
select
case
when CONFIDENTIALITY_IND = 'Y' or :EmployeeClass = 'XA'
then 'CONFIDENTIAL'
else db.table.name
end as name
from
db.student
对于这么小的查询来说,这不是什么大问题,但它们中的大多数都会返回许多字段(通常超过 20 个),而且出于显而易见的原因,我不喜欢这么多的 case 语句。由于 Reporting Services 的工作方式,我也无法进行一般替换,必须在每个字段上进行。
有没有更有效的方法,我可以在单个案例语句中用“机密”替换行中的每个值,或者至少是更优雅的方法?
编辑: 澄清一下,选择中不只有这个字段。我只为这个例子写了一个,但在生产中,一些报告正在考虑显示大量的列。我试图避免对可能返回相当大的数据集的报告的每一列进行两次比较。
您可以做的是使用以下逻辑编写两个存储过程:
希望我理解你的问题是正确的。这将是我的方式
在 Oracle 11.2.0.3 中,虚拟专用数据库允许您隐藏行或列。例如:
添加此策略后,Oracle 将 check_confidentiality 返回的谓词注入到针对学生表的每个查询中。
这与用“CONFIDENTIAL”替换每个值不同,但在您的情况下可能是可以接受的。有条件的编辑可以在 check_confidentiality 函数中实现(例如,通过检查用户是否是允许完全访问的角色的成员)。
另一种方法是创建 UNION ALL 视图:
特权检查可以是子查询或对应用程序上下文的调用(这将允许传递参数以查看)