在 teradata 过程中创建 table 会出现 SELECT 错误

Creating table inside teradata procedure gives SELECT error

我正在 TeraData Studio 中的 procedure 中创建一个易变的 table。我得到一个错误:

Executed as Single statement.  Failed [5315 : HY000] SP_EMPLOYEE:An owner referenced by user 
does not have SELECT access to DB_EMP.all_emp.code. 
Elapsed time = 00:00:00.109 

我知道它与 GRANT 选项有关,但我无法正确应用它。这是一小段代码:

replace PROCEDURE DBX_HOME.SP_Employee(IN variable INTEGER)
begin

   CREATE VOLATILE TABLE TEST_TABLE AS(
   SELECT distinct ID
   FROM DB_EMP.all_emp as prod left join DB_EMP_DWH.ID_no as infra
   ON prod.code=infra.code_infra
   WHERE AND ID MOD 3  = :variable )WITH DATA  ON COMMIT PRESERVE ROWS;

end;
-- Run the code below.
CALL DBX_HOME.SP_Employee(0)

我遵循了这个 link,但我无法正确应用 GRANT OPTION。谁能建议在何处授予权限以避免此错误?

当对象的所有者(= 存储对象的数据库)与创建者不同时,会弹出此错误。 Teradata 中的一般修复是在数据库级别 GRANT SELECT ON db2 to db1 WITH GRANT OPTION,只要 db1 是数据库而不是用户,它就是安全的。

对于存储过程,有一个替代方案,即标准 SQL 中的 SQL SECURITY 选项。

取决于谁应该能够 运行 您可能会使用 SQL SECURITY CREATOR 的 SP,它检查创建者的权利(=运行 是 CREATE PROC 的用户)对于在 SP 中提交的 SQL。或者 SQL SECURITY INVOKER 检查调用用户的权限。

Dynamic SQL 规则相当复杂,上面的链接有所有细节。