答案取决于您对结果的要求。无论用户权限如何,您是否需要具有一致列集的结果?如果是这样,您可以使用 IF 子句将不允许的值设置为 null(或其他一些特殊值),例如,
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1,
IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d,
UserPrivileges p
WHERE p.userId = '#'
AND d.DataId = '#'
当然,“特殊值”可能是一个问题,因为您需要一个永远不会出现在数据中的值。如果您需要知道空值(因为实际值为空)与空值(因为它是禁止列)之间的差异,那么您不能使用空值。
另一种方法是让您简单地包含结果中出现的每一列的权限指示器,并让您的业务逻辑使用它来确定哪些值对用户可见。
一种非常不同的方法将使结果集仅包含允许的列。在这种情况下,您需要动态构建 sql 语句。我不知道您是在存储过程中还是在主机语言中执行此操作,但基本思想是这样的:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
“执行”意味着您可以将字符串作为 sql 命令执行。
OP澄清后的更多信息:
好的,您需要 sql 函数返回一个类似于“column1,column2,...”的字符串。下面类似于 sql server 中的样子。句法
create function
FIELDS_NAME_QUERY (@userid int)
begin
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId
declare @result varhcar(60)
set @result = ''
if (@col1priv = 1) @result = 'col1'
if (@col2priv = 1) @result = @result + ' ,col2'
if (@col3priv = 1) @result = @result + ' ,col3'
return @result
end