我试图查看一个表,该表使用当前用户的用户名(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';
答案 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' } )
返回值:
有关Is_Member的更多信息,请查看msdn.microsoft.com on Is_Member或查看其他一些堆栈溢出问题。