我试图阻止不是我的用户在桌面上执行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;
/
答案 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;
解决了它