我有一个用于多个客户端的数据库。有一些表包含每个客户端的 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 个函数中更改它,这将影响使用它们的存储过程。