【问题标题】:Redshift grants - doing this programmaticallyRedshift 赠款 - 以编程方式执行此操作
【发布时间】:2020-09-01 13:30:09
【问题描述】:

我是 Redshift 领域的新手,但不是数据库本身。我正在尝试找出一种以编程方式在我的 redshift 集群中重新颁发授权的方法。很早之前就已经同意,被授予访问模式的用户将根据他们的工作角色和区域拥有 select 或 dml 访问权限。我想做与此类似的事情,但我似乎无法在我的 RS 集群中编译它。集群是 v1.0.18228

CREATE OR REPLACE FUNCTION adminscripts.update_groups(p_schema varchar)
        LANGUAGE plpgsql
        VOLATILE
AS $function$    
      DECLARE 
        v_schema_sel_gro varchar(100) := p_schema||'_sel_group';
        v_schema_dml_gro varchar(100) := p_schema||'_dml_group';
        v_schema_adm_gro varchar(100) := p_schema||'_adm_group';
        
        v_gro_exists int; 
        db          VARCHAR(100); 
        endtime     datetime; 
        SQL text; 
        unload_id    INT; 
        unload_time timestamp; 
        
BEGIN 

    select count(*) into v_gro_exists
    from pg_group where groname = v_schema_sel_gro ;
    
    IF v_gro_exists = 0 THEN 
        create group v_schema_sel_gro ;
    ELSE
        RAISE info 'SELECT Group already exits '; 
    END IF;
    
    GRANT USAGE ON SCHEMA p_schema TO GROUP v_schema_sel_gro;
    GRANT SELECT ON ALL TABLES IN SCHEMA p_schema TO GROUP v_schema_sel_gro;
    ALTER DEFAULT PRIVILEGES IN SCHEMA p_schema GRANT SELECT ON TABLES TO GROUP v_schema_sel_gro;
    
END; 
     $function$
;

任何帮助都会很棒!提前致谢。

杰里米

【问题讨论】:

  • “似乎无法编译”是什么意思?是否有任何特定的错误消息,或出现问题的特定行?
  • 当使用 SQLDeveloper/J 时,该过程永远不会编译。我总是得到一个错误并且没有创建过程。
  • 这里是错误 [Amazon](500310) 无效操作:在“$$ DECLARE v_schema_sel_gro varchar(100) := p_schema||'_sel_group'”处或附近未终止的美元引号字符串 位置:86 ; [SQL 状态=42601,数据库错误代码=500310]

标签: database amazon-web-services amazon-redshift plpgsql


【解决方案1】:

语法与 Amazon Redshift 不兼容。不知道函数的content在Redshift中能不能用,但是声明部分肯定是错的。

Amazon Redshift Scalar User-Defined Functions 像这样使用 CREATE FUNCTION

create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql; 

但是,它们不会影响数据库的内容。

因此,您可能想要使用Stored Procedures,它使用CREATE PROCEDURE

CREATE OR REPLACE PROCEDURE test()
AS $$
BEGIN
  SELECT 1 a;
END;
$$
LANGUAGE plpgsql
;

该文档还专门引用了您收到的错误消息:

某些客户端在创建 Amazon Redshift 存储过程时可能会抛出以下错误。

ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$

发生此错误的原因是客户端无法正确解析带有分号分隔语句和美元符号 ($) 引号的 CREATE PROCEDURE 语句。这会导致仅将部分语句发送到 Amazon Redshift 服务器。您通常可以使用客户端的 Run as batch 或 Execute selected 选项来解决此错误。

更多详情请见:Overview of stored procedures in Amazon Redshift - Amazon Redshift

【讨论】:

  • 你的最后一点似乎就是答案。我能够通过使用命令行而不是像 SQLWorkbench/J 这样的 sql 客户端来编译它。谢谢!!
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多