2016-03-02 22 views
1

我試圖使用當前用戶的用戶名(System_user)與他們的登錄信息([權限路徑]),它告訴我哪個表他們被允許在視圖中看到的數據的子集。視圖不能用變量或臨時表創建,所以試圖用戶定義的函數返回一個表,但它似乎超出了我目前的技能。我如何創建視圖在查詢中使用SYSTEM_USER的權限路徑

它可以作爲一個查詢

DECLARE @user as varchar(50) 
SELECT @user = SYSTEM_USER 

CREATE TABLE LoginInformation(
     [account name] varchar(50), 
     [type] varchar(50), 
     [privilege] varchar(50), 
     [mapped login name] varchar(50), 
     [permission path] varchar(50) 
) 

INSERT LoginInformation 
EXEC xp_LoginInfo @AcctName = @user, @Option = 'all'; 

SELECT * FROM SomeTableName 
WHERE Permission IN (SELECT [permission path] FROM LoginInformation) 

在創建視圖時我會被卡住,因爲我不能聲明一個變量:

DECLARE @user as varchar(50) 
SELECT @user = SYSTEM_USER 

當我試圖用戶自定義函數我耽擱了,因爲我可以不要插入執行語句

INSERT LoginInformation 
EXEC xp_LoginInfo @AcctName = @user, @Option = 'all'; 

我也似乎無法做到Ë簡單的解決方案:

INSERT LoginInformation 
    EXEC xp_LoginInfo @AcctName = SYSTEM_USER, @Option = 'all'; 

理想我想有把SYSTEM_USER作爲參數,並給了我只是用戶的[許可路徑]的表中的功能。然後我可以在我的視圖創建中使用它。

WHERE Permission IN (MyFunctionName(SYSTEM_USER)) 
+0

爲什麼你不使用'INSERT LoginInformation EXEC xp_LoginInfo @AcctName = SYSTEM_USER,@Option ='all';'在你的視圖內而不是聲明一個變量? –

+0

我不確定,但我收到一條消息:關鍵字'SYSTEM_USER'附近的語法錯誤。 – JaredStroeb

回答

0

在做額外的研究時,我發現了一個更容易和不同的方式來實現我的目標。我去了Is_Member功能。它訪問權限路徑而無需使用SYSTEM_USER。我已經做了一些測試,它似乎做我想要的。

CREATE VIEW [dbo].[vw_SomeTableName] 
SELECT * FROM SomeTableName 
where WHERE Is_Member(UserName) = 1) 

Is_Member function指示當前用戶是否爲指定的Microsoft Windows組或SQL Server數據庫角色的成員。

IS_MEMBER ({ 'group' | 'role' }) 

返回值:

  • 當前用戶不是組或角色的成員,則返回0
  • 當前用戶是組或角色的成員,返回1
  • 要麼組或角色無效。當通過SQL Server登錄名或使用應用程序角色的登錄名查詢時,將爲Windows組返回NULL。

有關Is_Member的更多信息,請查看msdn.microsoft.com on Is_Member或查看其他一些堆棧溢出問題。

0

xp_LoginInfo是一個存儲過程。

sp_helptext xp_LoginInfo 

它產生的輸出:

create procedure sys.xp_logininfo 
    @acctname  sysname = null,    -- IN: NT login name 
    @option   varchar(10) = null,   -- IN: 'all' | 'members' | null 
    @privilege  varchar(10) = 'Not wanted' OUTPUT -- OUT: 'admin' | 'user' | null 
as 
set nocount on 
etc ... 

我的建議是利用底層的SQL,如果需要調整它,使用它,您可以通過運行下面的T-SQL語句中看到它的底層代碼在你看來。

+0

很棒的建議,我一直在尋找一種方法來打開功能,並看看它是如何工作的。我一定會把'sp_helptext'放到我的SQL庫中。在這種情況下,我遇到了'OpenRowset(TABLE NETGROUPGETMEMBERS,@acctname)'' – JaredStroeb