我对我们的数据库拥有完全的管理员权限,因此可以查询和查看视图定义。但是,我想在 JDBC Jenkins 作业魔术中使用只读用户查询视图。问题:与我的管理员用户不同,只读用户看不到视图的代码/定义。
当我担任管理员时,此查询为我提供了所有视图所需的所有视图定义和元数据:
SELECT name AS VIEW_NAME,
definition,
create_date,
modify_date
FROM [my_database].[sys].[all_views]
JOIN [my_database].[sys].[sql_modules]
ON [my_database].[sys].[all_views].object_id = [my_database].[sys].[sql_modules].object_id
Run Code Online (Sandbox Code Playgroud)
结果,当以管理员身份执行查询时,我得到如下条目:
name | definition | create_date | modify_date
sample_view | SELECT * FROM bla | 01.01.2017 | 02.01.2017
Run Code Online (Sandbox Code Playgroud)
然而,当我用我的只读用户做这件事时,我得到了
name | definition | create_date | modify_date
sample_view | null | 01.01.2017 | 02.01.2017
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到我对只读用户的权限配置。尽管我已授予他必要的权限,但用户在结果集中看不到视图定义。
更奇怪的是,在允许用户执行 SELECT 和 VIEW 定义语句并保存配置之后,SELECT 和 VIEW DEFINITION 的第二个条目被添加到配置表中。
我的问题:我有一组视图,我想从中动态查询。我想将视图名称加载SELECT * from sys.all_views
到游标中(让我们称之为view_cursor
),然后在过程中执行以下操作:
-- loop starts
FETCH NEXT FROM view_cursor INTO @view_name;
SELECT * FROM @view_name;
-- fetch next
-- loop ends
Run Code Online (Sandbox Code Playgroud)
我已经在一个视图中尝试过这个,我将它作为参数传递给存储过程:
CREATE PROCEDURE [dbo].[query_Special_View](@view_name VARCHAR(100)) AS
DECLARE viewname VARCHAR(100);
DECLARE @counter INT = 0;
BEGIN
PRINT @view_name
EXECUTE('SELECT COUNT(Value) INTO' + @counter + 'FROM' + @view_name + '');
PRINT @counter;
END
Run Code Online (Sandbox Code Playgroud)
然后,我想使用现有视图名称执行该过程:
EXEC [dbo].[query_Special_View]
@view_name = N'A_very_special_LOC_view' -- the view name as parameter
GO
Run Code Online (Sandbox Code Playgroud)
结果是:
消息 207,级别 16,状态 1,第 1 行 列名“值”无效。
但是,我尝试 …