1. 执行DDL报错
在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句
--抄表表备份
SELECT TO_CHAR(SYSDATE,'YYMMDD') INTO V_DQRQ FROM DUAL;
V_CREATESQL := 'CREATE TABLE SF_EBZCB'||V_DQRQ||'_T AS SELECT * FROM SF_EBZCB_T';
EXECUTE IMMEDIATE V_CREATESQL;
当执行该语句时,提示 ORA-01031: 权限不足。该用户已赋予DBA权限。
原因:CREATE TABLE想使用CREATE ANY TABLE权限,而CREATE ANY TABLE权限来自DBA角色,默认情况下,虽然在会话环境中可见,但在存储过程中不可见(无效)。
即:ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显式授权。
GRANT CREATE ANY TABLE TO charge_liny;
执行上面sql显式授权后,在该用户下通过 EXECUTE IMMEDIATE 执行CREATE语句即可成功创建表。
2. 授权当前用户查询其他用户下的表
查询另一用户下的中间库某表中的数据并更新到当前用户中的某个表中,当调用其他用户的表时,需要使用 用户.表名 的格式来区分该表是否是当前用户下的表,这里也需要在被调用的用户下显式的授权给当前用户查询权限。
INSERT INTO SF_EBZCB_T
(YHBH, CNQ, JLBBH, SCBS, BCBS, YL, JSYL)
SELECT YHBH, CNQ, RBXH, QCBL, JZBL, BJYL, SJYL
FROM USER_INFO.RB_INFO
WHERE SYNCSTATE = 0
AND CNQ = SF_DQCNQ_F;
授权语句(在USER_INFO用户下)
GRANT SELECT ANY TABLE TO CHARGE_LINY;
授权其他DML权限
GRANT INSERT ANY TABLE TO CHARGE_LINY;
GRANT UPDATE ANY TABLE TO CHARGE_LINY;
GRANT DELETE ANY TABLE TO CHARGE_LINY;