Snowflake中如何按前缀批量授予视图SELECT权限?
正确操作方式
不同数据库对批量授权带前缀视图的语法支持不一样,你之前的语句没法直接生效,以下是主流数据库的可行方案:
MySQL/MariaDB
- 先执行查询生成所有需要授权的语句:
SELECT CONCAT('GRANT SELECT ON `', table_schema, '`.`', table_name, '` TO \'<role/user>\';') FROM information_schema.views WHERE table_name LIKE 'my_view_%';
- 把查询结果里的SQL语句复制出来直接执行,就能完成批量授权。如果想自动执行,也可以用预处理语句:
SET @sql = NULL; SELECT GROUP_CONCAT('GRANT SELECT ON `', table_schema, '`.`', table_name, '` TO \'<role/user>\';' SEPARATOR ' ') INTO @sql FROM information_schema.views WHERE table_name LIKE 'my_view_%'; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
注意替换<role/user>为实际的角色或用户名,同时确保你有足够权限执行这些操作。
PostgreSQL
PostgreSQL没有直接的LIKE过滤批量授权语法,得用动态SQL实现:
DO $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT table_schema, table_name FROM information_schema.views WHERE table_name LIKE 'my_view_%' LOOP EXECUTE format('GRANT SELECT ON %I.%I TO <role/user>;', rec.table_schema, rec.table_name); END LOOP; END $$;
替换<role/user>为目标角色即可。如果视图都在特定模式下,可以加上AND table_schema = 'public'(比如public模式)缩小范围。
SQL Server
同样需要生成动态SQL来批量授权:
DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'GRANT SELECT ON ' + QUOTENAME(table_schema) + '.' + QUOTENAME(table_name) + ' TO <role/user>; ' FROM information_schema.views WHERE table_name LIKE 'my_view_%'; EXEC sp_executesql @sql;
替换<role/user>为实际的用户或角色,执行后就会给所有符合前缀的视图授予SELECT权限。
内容的提问来源于stack exchange,提问作者Priya d
相关产品推荐
相关产品推荐

