如何在查询中使用SYSTEM_USER的权限路径创建视图

时间:2016-03-02 14:52:32

标签: sql sql-server tsql

我试图查看一个表,该表使用当前用户的用户名(System_user)及其登录信息([权限路径]),该表告诉我允许他们使用哪个数据子集在视图中看到。无法使用变量或临时表创建视图,因此尝试使用用户定义的函数返回表,但它似乎超出了我当前的技能。

它作为查询

where

创建视图时,我卡住了,因为我无法声明变量:

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';

理想情况下,我会有一个将System_user作为参数的函数,并为我提供了一个仅包含该用户的[权限路径]的表。然后我可以在我视图的创作中使用它。

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

2 个答案:

答案 0 :(得分:0)

xp_LoginInfo 是一个存储过程。您可以通过运行以下T-SQL语句来查看其底层代码:

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,如果需要调整它,并在你的视图中使用它。

答案 1 :(得分: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或查看其他一些堆栈溢出问题。