1

我有一个视图V,它从几个表中选择数据。我还有一个表T,它定义了允许用户查看V中哪种类型的数据。

对于用户来说,如果T中没有数据,这意味着他可以从我的视图V中查看所有内容,但是如果T中有数据,那么我需要限制我的视图V的结果。

所以在我看来,我需要在 T 中执行ifV Left join T nothing或在TV INNER JOIN T中执行if 。

但是我不太确定如何编写此查询以获得可能的最佳性能(就服务器执行而言),前提是视图V可能已经是一个不太快执行的查询。我应该首先从 B 中选择所有内容并将其存储在某个变量或临时表中吗?还是可以使用我至今未听说过的巧妙的 SQL 语法轻松完成所有事情?

4

2 回答 2

4

我建议不要关注问题的“内连接/外连接”部分,而是建议分两步进行。

首先,您的应用程序可以查询表“T”以确定用户的访问权限。然后,其次,使用“T”中的数据来确定用户在“V”中可以访问的内容。

如果您正在编写一个同时控制数据库层和业务层的服务器应用程序,那么首先编写一个过程来收集所有用户的权限设置,然后执行两个查询之一 - 特权查询或非特权查询,具体取决于T 的内容。

如果您必须在数据层中执行所有这些操作,请按以下步骤操作:

CREATE PROCEDURE myproc
    @current_user int
AS

-- Determine user's permission level
DECLARE @permission bit
SELECT @permission = permission FROM T WHERE t.user = @current_user

-- Use the appropriate query for this user
IF @permission IS NULL BEGIN
    SELECT * FROM V
END ELSE BEGIN
    SELECT * FROM V INNER JOIN T ON T.criteria=V.criteria
END
于 2012-08-20T17:36:03.607 回答
2

如果您有一个在 T 中包含所有行的“默认”用户,则只能通过内部连接来完成。否则,您将陷入以下困境:

select V.*
from V,
T
where (v.id = T.Id 
AND T.User = current_user)
OR NOT EXISTS (select 1 from T where T.user=current_user)
于 2012-08-20T17:17:34.010 回答