我使用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语句。
问题:
GRANT
是其中之一。在这一点上,我不确定我尝试做的事情是否可能。指针将不胜感激。
答案 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中对此进行了更详细的说明。