【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;

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值