【问题标题】:Grant permission to role if exists in SAP HANA授予角色权限(如果 SAP HANA 中存在)
【发布时间】:2018-07-16 07:41:06
【问题描述】:

我使用 Flyway 和用于创建和填充模式的 HANA JDBC 驱动程序设置了 HANA 数据库部署。作为部署的一部分,我还想做的事情是授予特定数据库角色对该模式的读取访问权限。不过为了避免迁移错误,我还是先验证一下这个角色是否存在,无法让这部分逻辑工作。

离我最近的是

DO
BEGIN
    DECLARE I INTEGER;
    SELECT COUNT(*) INTO I
    FROM roles
    WHERE role_name = 'MYROLE';
    IF I > 0
    THEN
        GRANT SELECT ON SCHEMA myschema TO MYROLE;
    END IF;
END;

但这失败了

SQL State  : HY000
Error Code : 7
Message    : SAP DBTech JDBC: [7] (at 140): feature not supported: DDL statements other than CREATE/DROP TABLE is/are not supported in anonymous block: line 9 col 9 (at pos 140)
Location   : db/migration/V1.10__my_script.sql (snip)
Line       : 1
Statement  : DO

我还通过尝试创建一个临时存储过程并执行该过程来尝试这个 - 不支持 DDL 语句的同样问题。

问题:

  • 我需要根据选择查询的结果执行 IF-THEN-ELSE
  • HANA 似乎不支持在 IF 子句中嵌套 SELECT 语句,因此我需要将结果保存在变量中并改用它
  • 仅支持在块内部声明变量,例如匿名块或存储过程的主体
  • 块也禁止执行大多数 DDL 语句 - GRANT 就是其中之一。

在这一点上,我不确定我正在尝试做的事情是否可能。指针将不胜感激。

【问题讨论】:

    标签: sql hana


    【解决方案1】:

    您的代码应进行如下修改:

    做 开始 声明 I 整数;

    SELECT COUNT(*) INTO I
    FROM roles
    WHERE role_name = 'MYROLE';
    
    IF :I > 0 THEN
        exec 'GRANT SELECT ON SCHEMA myschema to MYROLE';
    END IF;
    

    结束;

    要访问IF 语句中的I 变量值,您需要使用: 表示法。 正如您提到的,某些 DDL 语句在 SQL 脚本中不直接支持,但您可以使用 EXEC 命令将它们作为动态 SQL 命令运行。

    一般来说,这种处理特权的方法是相当有问题的,因为您的过程的结果,即 MYROLE 究竟可以使用哪些特权,取决于

    • 如果已经存在同名角色
    • 允许运行该过程的安全上下文授予什么权限

    SAP HANA 提供HDI(HANA 部署基础架构)存储库对象类型.hdbrole,允许将权限捆绑到角色中,并在安装时完全(或根本不)部署这些角色。即使在将角色分配给其他角色和用户之后,这种方法也允许更新角色的权限分配,而无需重新分配。

    动态地构建角色和分配权限使得更难理解何时、何地以及为什么将权限分配给角色/用户。这通常不是您想要的。相反,您希望在应用程序中的知名位置而不是其他任何地方分配权限。因此,指针实际上是使用您的过程,而是使用可用于角色定义的 HANA 工具。 所有这些都在SAP HANA documentation 中有更详细的解释。

    【讨论】:

    • 谢谢!将来我们肯定会仔细研究用户/角色管理,因为很明显这不是你应该做的,但这应该足以让我们渡过难关。
    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2016-03-07
    • 2019-05-16
    • 1970-01-01
    • 2018-10-11
    • 2019-04-13
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多