如何限制不允许不加where的更新!!!

菜鸟先飞888 2015-10-27 03:34:42
现有一个系统,有一个更新信息的功能,但是没有做防注入功能,可以在备注中加‘ --’达到更新该表中所有记录的效果,这是不允许的,在不改源程序的情况下,有没有办法通过oracle数据库,做触发器,限制不允许一次更新多行,或都不允许不加where的更新,请高手出招
...全文
194 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜未眠风已息 2015-10-27
  • 打赏
  • 举报
回复
引用 2 楼 huangshiwu 的回复:
[quote=引用 1 楼 fjw044586 的回复:] 1. 创建一个函数 func_test,函数里使用 SYS_CONTEXT('USERENV','CURRENT_SQL',4000); 获取当前session执行的语句 然后判断语句里是否有where 如果没有则抛错 2. 然后在要控制的数据表上使用dbms_rls.add_policy添加一个策略 在对表执行update,delete的操作时调用函数 func_test
感谢回复,如果可以,希望给出详细SQL语句,另外想问一下,如果有很多表(大概100个)都需要这样限制,会不会影响性能? 再有就是能否限制一次只能更新一行呢?[/quote] 增加了额外的检查操作,肯定会对性能有影响的,,, 另外你的触发器根本编译不过去吧。。“@” 是sqlserver里定义变量时才用的,,,oracle不用的 你改成以下 create or replace trigger check_base BEFORE update on base FOR EACH ROW declare rows int; begin if sql%rowcount > 0 then rows:=rows+1; if rows > 1 then RAISE_APPLICATION_ERROR(-20001, '你不是在跟我开玩笑吧!这个不可以滴'); end IF; end if; end;
菜鸟先飞888 2015-10-27
  • 打赏
  • 举报
回复
create or replace trigger check_base BEFORE update on base FOR EACH ROW declare @rows int; begin if sql%rowcount > 0 then @rows ++; if @rows > 1 then RAISE_APPLICATION_ERROR(-20001, '你不是在跟我开玩笑吧!这个不可以滴'); end if end if; end; 我想用上面的触发器,好像不能,请帮忙分析一下 加上这个触发器,所有都不能正常更新了
菜鸟先飞888 2015-10-27
  • 打赏
  • 举报
回复
引用 1 楼 fjw044586 的回复:
1. 创建一个函数 func_test,函数里使用 SYS_CONTEXT('USERENV','CURRENT_SQL',4000); 获取当前session执行的语句 然后判断语句里是否有where 如果没有则抛错 2. 然后在要控制的数据表上使用dbms_rls.add_policy添加一个策略 在对表执行update,delete的操作时调用函数 func_test
感谢回复,如果可以,希望给出详细SQL语句,另外想问一下,如果有很多表(大概100个)都需要这样限制,会不会影响性能? 再有就是能否限制一次只能更新一行呢?
夜未眠风已息 2015-10-27
  • 打赏
  • 举报
回复
1. 创建一个函数 func_test,函数里使用 SYS_CONTEXT('USERENV','CURRENT_SQL',4000); 获取当前session执行的语句 然后判断语句里是否有where 如果没有则抛错 2. 然后在要控制的数据表上使用dbms_rls.add_policy添加一个策略 在对表执行update,delete的操作时调用函数 func_test

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧