2014-10-03 91 views
0

我遇到问题,下面的查询只从当前连接到的数据库中选择视图,而不是全部。无论如何要做到这一点,而不是使用sp_MSForEachDB查询SQL Server 2012数据库实例中的所有视图

DECLARE @useText VARCHAR(500) 
DECLARE @viewNM VARCHAR(500) 
DECLARE @schemaNM VARCHAR(500) 
DECLARE @dbNM VARCHAR(500) 
DECLARE @sqlCmd varchar(4000) 

DECLARE DBCursor CURSOR GLOBAL FOR 
    SELECT NAME FROM SYS.DATABASES 

OPEN DBCursor 
FETCH NEXT FROM DBCursor INTO @dbNM 

WHILE @@FETCH_STATUS <> -1 
BEGIN 
    SET @useText = 'USE [' + @dbNM + ']' 
    EXEC(@useText) 

    DECLARE ViewCursor CURSOR FOR 
     SELECT 'GRANT SELECT ON ' + '[' + SCHEMA_NAME(schema_id) + '].[' + name + ']' + ' TO [account]' 
     FROM SYS.VIEWS V 

    OPEN ViewCursor 
    FETCH NEXT FROM ViewCursor INTO @sqlCmd 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     PRINT(@sqlCmd) 
     FETCH NEXT FROM ViewCursor INTO @sqlCmd 
    END 

    CLOSE ViewCursor 
    DEALLOCATE ViewCursor 

    FETCH NEXT FROM DBCursor INTO @dbNM 
END 

CLOSE DBCursor 
DEALLOCATE DBCursor 

回答

1

EXEC语句执行字符串,字符串作为其自身含有批处理执行。因此,USE dbname不会影响EXEC以外的查询。

我构建了一个像这样的查询语句SELECT 'GRANT SELECT ON [' + SCHEMA_NAME(schema_id) + '].[' + name + '] TO [account]' FROM [master].SYS.VIEWS V;,其中数据库名称被插入到SYS.VIE​​WS之前。

见下文:

DECLARE @useText VARCHAR(500) 
DECLARE @viewNM VARCHAR(500) 
DECLARE @schemaNM VARCHAR(500) 
DECLARE @dbNM VARCHAR(500) 
DECLARE @sqlCmd varchar(4000) 

DECLARE DBCursor CURSOR GLOBAL FOR 
    SELECT NAME FROM SYS.DATABASES 

OPEN DBCursor 
FETCH NEXT FROM DBCursor INTO @dbNM 

WHILE @@FETCH_STATUS <> -1 
BEGIN 

     set @sqlCmd = 'SELECT ''GRANT SELECT ON ['' + SCHEMA_NAME(schema_id) + ''].['' + name + ''] TO [account]'' FROM [' + @dbNM + '].SYS.VIEWS V;' 

     exec(@sqlCmd); 

    FETCH NEXT FROM DBCursor INTO @dbNM 
END 

CLOSE DBCursor 
DEALLOCATE DBCursor 

编辑:

你可以在GRANT前追加USE

set @sqlCmd = 'SELECT ''USE ' + @dbNM + '; GRANT SELECT ON ['' + SCHEMA_NAME(schema_id) + ''].['' + name + ''] TO [account]'' FROM [' + @dbNM + '].SYS.VIEWS V;' 
+0

嗯,我想你可能会遇到GRANT的另一个问题。您只能授予或撤销当前数据库中对象的权限。 – jim31415 2014-10-03 19:33:54

相关问题