【发布时间】:2020-10-15 17:29:44
【问题描述】:
我尝试将所有 db 对象的只读访问权限授予另一个可能不存在的用户。这就是我尝试这样做的方式:
DECLARE
user_exists NUMBER;
BEGIN
SELECT COUNT(*) INTO user_exists FROM ALL_USERS WHERE USERNAME = '${user}';
IF user_exists > 0 THEN
FOR obj IN (SELECT object_name, object_type
FROM all_objects
WHERE owner = '${owner}'
AND object_type IN ('TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE'))
LOOP
IF obj.object_type IN ('TABLE', 'VIEW') THEN
EXECUTE IMMEDIATE 'GRANT SELECT ON ${owner}.' || obj.object_name ||
' TO ${user}';
ELSIF obj.object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE') THEN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON ${owner}.' || obj.object_name || ' TO ${user}';
END IF;
END LOOP;
END IF;
END;
脚本失败并显示以下消息:
Message : ORA-00942: table or view does not exist
ORA-06512: at line 16
ORA-06512: at line 16
我做错了什么?
【问题讨论】:
-
你是如何运行脚本的?
${user}和${owner}不是 SQLPlus 的有效替换语法。 -
我使用 flyway 运行脚本。 ${placeholder} 有效。我写了很多其他类似的脚本,没有问题。