问题描描述:
存储过程中主要包括两个逻辑块,一是将其他用户表中的数据truncate,一个是将新数据 插入到其他用户表中。南京Oracle认证培训
此存储过程创建、编译、单步调试都没有任何问题。但是执行完成后,发现原表中的数据没有变化。这说明此存储过程的执行中存储问题。
查询错误信息记录日志表,发现确实是有错误记录。可以肯定存储过程没有被正确执行。
这时,我们可以将调用dbms_output.put_line();这个 包来获取具体的错误信息。 将此包加入到存储过程中后,执行存储过程,提示没有权限,而看报错的顺序,是truncate语句没有执行权限。
但是把truncate说句单独执行,是没有问题的。
现在我们可以将此问题定义为授予用户的role在存储过程中无效。南京Oracle认证培训
解决方法:
1. 将truncate语句封装到表所有者用户下。然后让存储过程的创建用户去调用这个包。
2. 在存储过程中加入AUTHIID {[CURRENT_USER|DEFINED]}
然而,第二种方法不是很推荐,因为truncate其他用户的表,是需要drop any table 这个权限的。这种授权操作存在很大风险。南京Oracle认证培训