如果SAP HANA中存在角色,则授予角色权限

时间:2018-07-16 07:41:06

标签: sql hana

我使用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是其中之一。

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

1 个答案:

答案 0 :(得分:2)

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

DO 开始     声明我的整数;

SELECT COUNT(*) INTO I
FROM roles
WHERE role_name = 'MYROLE';

IF :I > 0 THEN
    exec 'GRANT SELECT ON SCHEMA myschema to MYROLE';
END IF;

END;

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

一般而言,这种处理特权的方法存在很大问题,因为您的过程的结果(即 MYROLE 确切可使用的特权)取决于

  • 如果已经存在一个同名角色
  • 允许对运行该过程的安全上下文授予哪些特权

SAP HANA提供HDI(HANA部署基础结构)存储库对象类型.hdbrole,该对象类型允许将特权捆绑到角色中,并在安装时完全(或完全不)部署特权。这种方法还允许在将角色分配给其他角色和用户之后,无需重新分配就可以更新对角色的特权分配。

动态地建立角色和分配特权使得要在何时,何地以及为什么将特权分配给角色/用户变得更加困难。通常这不是您想要的;取而代之的是,您希望在应用程序中一个众所周知的位置分配特权,而在其他任何地方都没有。因此,指针实际上是使用您的过程,而是使用可用于角色定义的HANA工具。 SAP HANA documentation中对此进行了更详细的说明。