我是靠谱客的博主 野性御姐,最近开发中收集的这篇文章主要介绍【oracle】 记一次与触发器,函数的奇妙历程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

历程

  • 触发器

在使用oracle时,当前用户是 A,发现往 B 用户的 table01 表取数据,然后再往B的这张表插数据时,突然报错了。

ORA-06502: PL/SQL: 数字或值错误 :
字符串缓冲区太小
ORA-06512: 在 "B.table01", line 3

       百度之后,了解到可能是因为字段设置得太小,然后填入的数据长度太长导致的,接着我去查看 B 用户的 table01 的那个字段大小,发现大小设置为了 256 ,而我填入的数据长度仅为200,却仍然报这个错误。接着我去问了某某大佬,发现是这个字段设有触发器

-- 查询某表的所有触发器(在该表的隶属用户下查询)
select * from all_triggers where table_name='xxxx';

       这个触发器的作用是将填入的数据经过一个自定义的加密函数处理,才放入数据库中,我填入的数据长度是200,被触发器处理之后数据长度就超过了256 ,所以就会报这样的错误。

-- 查询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) )

-- 将函数的使用授权给其他用户(functionName为函数名)
grant execute on B.functionName to A;

 

 

 

最后

以上就是野性御姐为你收集整理的【oracle】 记一次与触发器,函数的奇妙历程的全部内容,希望文章能够帮你解决【oracle】 记一次与触发器,函数的奇妙历程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部