如果 SAP HANA 中存在角色,则授予角色权限
Grant permission to role if exists in SAP 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 语句的问题相同。
问题:
- 我需要根据 select 查询的结果执行 IF-THEN-ELSE
- HANA 似乎不支持在 IF 子句中嵌套 SELECT 语句,因此我需要将结果保存在一个变量中并使用它来代替
- 仅支持在块内声明变量,例如匿名块或存储过程的主体
- 块也禁止执行大多数 DDL 语句 -
GRANT
是其中之一。
在这一点上,我不确定我正在尝试做的事情是否可行。不胜感激。
您的代码应该可以进行如下修改:
做
开始
声明我是整数;
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
变量值,您需要使用 :
表示法。
正如您提到的,SQL 脚本不直接支持某些 DDL 语句,但您可以使用 EXEC
命令将它们 运行 作为动态 SQL 命令。
一般来说,这种处理权限的方法是相当有问题的,因为您的过程的结果,即 MYROLE 可以使用的权限,取决于
- 如果已经存在同名角色
- 允许运行过程授予
的安全上下文有什么特权
SAP HANA 提供 HDI
(HANA 部署基础设施)存储库对象类型 .hdbrole
,允许将权限捆绑到角色中,并在安装时完全(或根本不)部署这些角色。即使在角色已分配给其他角色和用户之后,此方法也允许更新角色的权限分配,而无需重新分配。
动态构建角色和分配权限使得更难理解何时、何地以及为什么将权限分配给 roles/users。这通常不是您想要的;相反,您希望在您的应用程序中的一个众所周知的地方而不是其他任何地方分配特权。因此,指针实际上是 而不是 使用您的过程,而是使用可用于角色定义的 HANA 工具。
SAP HANA documentation.
中对所有内容进行了更详细的解释
我使用 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 语句的问题相同。
问题:
- 我需要根据 select 查询的结果执行 IF-THEN-ELSE
- HANA 似乎不支持在 IF 子句中嵌套 SELECT 语句,因此我需要将结果保存在一个变量中并使用它来代替
- 仅支持在块内声明变量,例如匿名块或存储过程的主体
- 块也禁止执行大多数 DDL 语句 -
GRANT
是其中之一。
在这一点上,我不确定我正在尝试做的事情是否可行。不胜感激。
您的代码应该可以进行如下修改:
做 开始 声明我是整数;
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
变量值,您需要使用 :
表示法。
正如您提到的,SQL 脚本不直接支持某些 DDL 语句,但您可以使用 EXEC
命令将它们 运行 作为动态 SQL 命令。
一般来说,这种处理权限的方法是相当有问题的,因为您的过程的结果,即 MYROLE 可以使用的权限,取决于
- 如果已经存在同名角色
- 允许运行过程授予 的安全上下文有什么特权
SAP HANA 提供 HDI
(HANA 部署基础设施)存储库对象类型 .hdbrole
,允许将权限捆绑到角色中,并在安装时完全(或根本不)部署这些角色。即使在角色已分配给其他角色和用户之后,此方法也允许更新角色的权限分配,而无需重新分配。
动态构建角色和分配权限使得更难理解何时、何地以及为什么将权限分配给 roles/users。这通常不是您想要的;相反,您希望在您的应用程序中的一个众所周知的地方而不是其他任何地方分配特权。因此,指针实际上是 而不是 使用您的过程,而是使用可用于角色定义的 HANA 工具。 SAP HANA documentation.
中对所有内容进行了更详细的解释