【问题标题】:Creating table inside teradata procedure gives SELECT error在 teradata 过程中创建表会导致 SELECT 错误
【发布时间】:2020-12-21 11:09:08
【问题描述】:

我正在 TeraData Studio 中创建一个易失性表,位于 procedure 内。我收到一个错误:

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 选项有关,但我无法正确应用它。这是一段小sn-p代码:

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。谁能建议在哪里授予权限以避免此错误?

【问题讨论】:

  • 根据您的需要,您可以尝试不同的SQL SECURITY 设置:docs.teradata.com/reader/scPHvjfglIlB8F70YliLAw/… 可能是 CREATOR 或 INVOKER
  • 感谢您的提示。我需要在程序中的哪里应用设置?
  • 它是 CREATE 的一部分:replace PROCEDURE DBX_HOME.SP_Employee(IN variable INTEGER) SQL SECURITY CREATOR begin
  • 关于 GRANT 将是 grant select on DB_EMP.all_emp to DB_where_SP_is_created WITH GRANT OPTION
  • 先生,我是 TeraData 的初学者,对 Grant 不了解。我不知道你做了什么魔法,但它已经解决了这个问题。我不再收到任何错误。我刚刚添加了SQL SECURITY CREATOR,它起作用了。您能否在答案中添加此内容,以便我接受?

标签: sql stored-procedures teradata


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2020-09-25
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多