0

我有一个用于多个客户端的数据库。有一些表包含每个客户端的 UI 用户的 UserName 和 SecurityAccess。这些“用户”不是在实际数据库中登录的用户。

Select u.userName, r.roleCode, ru.AppliesToTable, ru.noAccessField
From dbo.SUserList u with(Nolock) 
Join  dbo.SRoleList r with(nolock)  on 
    u.roleCode = r.roleCode
Join  dbo.SRoleRuleList ru with(nolock)  on 
    r.roleCode = ru.roleCode 
where u.username = 'ABC123\KSmith'

上面的代码将返回用户名、他们的角色、作为AppliesToTable 的数据库表和一个逗号分隔的他们无法访问的字段列表作为NoAccessField

运行 SSRS 报告时,请求报告的用户名在执行返回数据集的存储过程中通过参数传递。如果该用户的 NoAccessField 字段中存在该字段,则仍需要返回这些列但没有数据。

实现这一目标的最佳方法是什么?我考虑过从存储过程中调用一个函数:

Select company, userid, totalAmount, accrualRate, availableDollarAmount 
Into #EmployeeAccruals 
From EmployeeAccruals_tfn(@UserID) --proposed function to limit results

在上述情况下,该用户将无权访问费率。用户名将被传递给函数,它将返回所有 5 列,但 accrualRate 将为空。从那里,我可以使用正常返回的数据来完成创建我的数据集以返回报告。

使用函数时,我不确定构造函数的最佳方式。我可以为每个数据库表创建一个函数,并在函数内对 select 的每个字段执行 case 语句,但这是正确的方法吗?

Select 
company, 
userid, 
case when @NoAccessField like %totalAmount% then NULL else totalAmount end as totalAmount, 
case when @NoAccessField like %accrualRate%, then NULL else accrualRate end as accrualRate, 
case when @NoAccessField like %availableDollarAmount%, then NULL else availableDollarAmount end as availableDollarAmount
From dbo.EmployeeAccruals

这似乎真的很低效。我还可以在函数中构建表变量,然后进行一系列更新

Update @EmployeeAccruals 
set accrualRate = NULL 
where @NoAccessField like %accrualRate%

你会如何处理这个问题?

编辑补充:功能背后的思考过程是安全性需要可扩展。如果需要对安全性进行更改,我不想更新 1000 个存储过程(每个 ssrs 报告都有一个 sp)。我宁愿在 20 个函数中更改它,这将影响使用它们的存储过程。

4

0 回答 0