2021年06月12日   码农之路   712 次浏览
公司oracle的开发环境数据库权限没做特别的限制,一个帐号供所有人开发人员使用,偶尔会出现重要的表被清空和删除的情况(可能是小白的误操作,也可能是程序的BUG),所以需要对核心表进行限制,以防止表被删除和数据丢失。
主要通过trigger在表进行DDL操作前进行控制:
create or replace trigger tr_ddl_deny
before create or alter or drop or truncate on database
declare
l_errmsg varchar2(500);
begin
-- 哪些表不允许执行DDL操作
if ora_dict_obj_name = 'SYS_CONFIG' or -- 参数表
ora_dict_obj_name = 'SYS_MENU' or -- 菜单表
ora_dict_obj_name = 'SYS_DICT' then -- 字典表
-- 不允许执行哪些DDL操作
if ora_sysevent = 'CREATE' or ora_sysevent = 'ALTER' or
ora_sysevent = 'DROP' or ora_sysevent = 'TRUNCATE' then
l_errmsg := ora_sysevent || ' ' || ora_dict_obj_name ||
',您没有权限执行此操作,请联系管理员。';
raise_application_error(-20001, l_errmsg);
end if;
end if;
exception
when no_data_found then
null;
end tr_ddl_deny;
oracle只提供了一些基本的操作信息,没有记录操作者相关的信息,我们需要记录这些操作者信息来跟踪(主要是要找到原因防止线上事故),可以根据以下信息创建一个操作日志表,然后在弹出错误信息之前插入操作日志。
SELECT machine,
SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
osuser,
SYS_CONTEXT('USERENV', 'SESSION_USER'),
program,
TO_CHAR(audsid)
FROM v$session
WHERE audsid = USERENV('SESSIONID'));
>>> Hello World <<<
这篇内容是否帮助到你了呢?
如果你有任何疑问或有建议留给其他朋友,都可以给我留言。