历程
- 触发器
在使用oracle时,当前用户是 A,发现往 B 用户的 table01 表取数据,然后再往B的这张表插数据时,突然报错了。
复制代码
1
2
3ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 "B.table01", line 3
百度之后,了解到可能是因为字段设置得太小,然后填入的数据长度太长导致的,接着我去查看 B 用户的 table01 的那个字段大小,发现大小设置为了 256 ,而我填入的数据长度仅为200,却仍然报这个错误。接着我去问了某某大佬,发现是这个字段设有触发器。
复制代码
1
2-- 查询某表的所有触发器(在该表的隶属用户下查询) select * from all_triggers where table_name='xxxx';
这个触发器的作用是将填入的数据经过一个自定义的加密函数处理,才放入数据库中,我填入的数据长度是200,被触发器处理之后数据长度就超过了256 ,所以就会报这样的错误。
复制代码
1
2-- 查询B表下的自定义函数 SELECT * FROM ALL_OBJECTS WHERE OWNER = 'B' and OBJECT_TYPE = 'FUNCTION';
- 函数
回到我一开始的操作:
当前用户是 A,发现往 B 用户的 table01 表取数据,然后再往B的这张表插数据时,突然报错了。
从 table01 中读取数据,然后又写回 table01 中,竟然会报这样的错误,这是因为我读取数据的时候没有经过解密处理,便将取出的加密数据又写回去。
那么我应该在读取table01的数据时,使用另一个自定义的解密函数处理数据,但问题又来了,我所在的用户为A,而且要使用的自定义函数隶属用户为B,A用户没有访问权限。
所以要把B的函数使用授权给用户A(A在使用该函数时,要写用户前缀:B.functionName(xxx) )
复制代码
1
2-- 将函数的使用授权给其他用户(functionName为函数名) grant execute on B.functionName to A;
最后
以上就是野性御姐最近收集整理的关于【oracle】 记一次与触发器,函数的奇妙历程的全部内容,更多相关【oracle】内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复