处理未经许可的DML操作的异常

时间:2015-03-21 21:01:28

标签: sql oracle

我试图阻止不是我的用户在桌面上执行DML操作。我正在使用触发器,但语法有些问题。这是“如果用户不是'我'的一部分让我烦恼。另外,是说”回滚“,足以撤销操作?谢谢!

create or replace trigger only_me_ex
before insert or update or delete on table
for each row
declare
only_me_ex exception;
begin
if user is not 'me' then
raise only_boss exception;
end if;
exception
when only_me_ex then
raise_appication_error(-200001,'Not permitted!');
rollback;
end;
/

2 个答案:

答案 0 :(得分:1)

在您的代码中,您使用“USER”关键字,该关键字实际上是执行操作的架构。例如。 SCOTT是emp table的所有者。如果您以SCOTT身份登录并在emp表上执行更新,则触发器中使用的USER为SCOTT。如果以SYS身份登录并在表上执行DML,则USER将为SYS。总结一下:

您不需要这样的触发器,您需要仅对应该被允许的用户授予此表上的插入,更新,删除权限。

事实上,您可能需要了解操作系统用户而不是架构(用户):

SYS_CONTEXT('USERENV','OS_USER')
编辑:根据您的评论,这是出于学术目的,我对您的触发器进行了更改,因此它现在可以编译并运行(我坚持使用您的方法来声明异常,提升它并将其处理为重新发布应用程序错误,对我来说没有多大意义,但没关系)

create table my_table (id number)
/
create or replace trigger only_me_ex
before insert or update or delete on my_table

declare
only_me_ex exception;
begin
if user!='TESTUSER' then
raise only_me_ex ;
end if;
exception
when only_me_ex then
raise_application_error(-20001,'Not permitted!');
end;
/

请注意,我将触发器从级别行触发器更改为语句触发器,因为它只需要执行一次,我省略了不需要的rollback关键字,因为没有任何东西可以回滚(除非你想回滚一些先前的操作在交易中);

答案 1 :(得分:0)

if user not in ('testuser') then raise not_a_chance;

解决了它