ORACLE 触发器控制用户登录之权限限制

    出于数据安全性,公司要求DBA实现控制拒绝特定的用户登录,由于公司不同的工作楼层分属于不同的vlan,因此单从linux主机层次依赖ACL访问列表控制登录数据库服务器,已经不能实现。
因此,只能考虑从数据库内部加以限制登录数据库,也就是借助oracle Trigger实现登录验证,实现方法就是捕获到拒绝登录的用户就抛应用异常强制用户退出登录,也就是使用Raise_Application_Error
实现,但是 需要注意的是,被限制的用户不能有DBA权限,也不能有imp_full_database权限。其实,想想也明白,如果不小心限制了dba权限的用户登录,那么sys就不能登录数据库,也就全完蛋了。
/**
功能:实现限制特定用户登录数据库
注意:被限制用户不能有dba及imp_full_database权限,否则该触发器不能起作用
日期:2017-1-4
**/
Create Or Replace Trigger DENY_LOGIN  
 After Logon On Database
Declare
 v_Program Varchar2(48);
 v_Message Varchar2(1000);
 v_deny_Client Exception;
 v_deny_User Exception;
 v_deny_Ip Exception;
Begin
 Select Program Into v_Program From V$session Where Audsid = Sys_Context('USERENV', 'SESSIONID') And Rownum < 2;
 If  Lower(v_Program) = 'plsqldev.exe' Then
     Raise v_deny_Client;
 End If;
 If  User In ('SCOTT','scott') Then
     Raise v_deny_User;
 End If;
 If Sys_Context('USERENV', 'ip_address') = '10.117.196.52' Then
     Raise v_deny_Ip;
 End If;
Exception
 When v_deny_Client Then
   v_Message := 'Sorry!You cannot access database using this software client!';
   Raise_Application_Error(-20001, v_Message);
 When v_deny_User Then
   v_Message := 'Sorry!Database deny you('||User||') access,Contact DBAs please!';
   Raise_Application_Error(-20002, v_Message);
 When v_deny_Ip Then
   v_Message := 'Sorry!Database deny you('||Sys_Context('USERENV', 'SESSIONID') ||') access,Contact DBAs please!';
   Raise_Application_Error(-20003, v_Message);
 When Others Then
   v_Message := 'ERROR – NOT_LOGON TRIGGER- Please Contact Your DBA!!' || Sqlerrm;
   Raise_Application_Error(-20004, v_Message);
End;
部分测试结果如下:
C:\Users\localadmin>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 09:32:27 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> revoke dba from scott;
撤销成功。
SQL> quit
从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
C:\Users\localadmin>sqlplus scott/oracle@oradb
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 09:32:39 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
ERROR:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20002: Sorry!Database deny you(SCOTT) access,Contact DBAs please!
ORA-06512: 在 line 24
请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
SP2-0157: 在 3 次尝试之后无法连接到 ORACLE, 退出 SQL*Plus
C:\Users\localadmin>
C:\Users\localadmin>sqlplus scott/oracle
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 09:48:42 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
ERROR:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20002: Sorry!Database deny you(SCOTT) access,Contact DBAs please!
ORA-06512: 在 line 24
请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名:
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
SP2-0157: 在 3 次尝试之后无法连接到 ORACLE, 退出 SQL*Plus
C:\Users\localadmin>

C:\Users\localadmin>sqlplus zhul/oracle
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 09:51:43 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29357786/viewspace-2131845/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29357786/viewspace-2131845/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Oracle 数据库中创建语句级触发器,可以使用以下 SQL 语句: ``` CREATE OR REPLACE TRIGGER trigger_name BEFORE INSERT OR UPDATE OR DELETE ON scott.emp FOR EACH ROW DECLARE -- 声明变量 v_username VARCHAR2(30); BEGIN -- 获取当前操作的用户名 SELECT USER INTO v_username FROM DUAL; -- 如果不是 scott 用户,则抛出异常 IF v_username != 'SCOTT' THEN RAISE_APPLICATION_ERROR(-20000, '非法用户,无法执行增删改操作。'); END IF; END; ``` 其中,`trigger_name` 是触发器的名称,`scott.emp` 是你要对其进行安全检查的表。上面的触发器定义了在对 `scott.emp` 表执行 INSERT、UPDATE 或 DELETE 操作之前,检查当前操作的用户名是否为 `SCOTT`,如果不是,则抛出异常,终止操作的执行。 ### 回答2: 在Oracle数据库中,可以使用语句级触发器对scott用户的emp表上进行安全检查,以限制只有scott用户才能进行数据的增删改操作。 首先,我们需要创建一个触发器,命名为emp_check_trigger。在触发器代码中,我们可以使用ORA_LOGIN_USER函数获取当前登录用户的用户名。 然后,我们可以在触发器中使用一个IF条件语句来进行判断。如果当前登录用户不是scott用户,则触发器中的代码将会被执行。 在IF条件语句内部,我们可以使用RAISE_APPLICATION_ERROR函数来抛出一个自定义的错误信息,以阻止非scott用户进行数据增删改操作。例如,我们可以使用以下代码抛出一个错误信息: IF (ORA_LOGIN_USER != 'scott') THEN RAISE_APPLICATION_ERROR(-20001, '只有scott用户可以进行数据增删改操作!'); END IF; 当触发器被触发时,如果当前登录用户不是scott用户,将会抛出一个自定义错误信息,阻止数据的修改。这样,只有scott用户才能够进行数据的增删改操作,其他用户将被限制。 通过这种方式,我们可以在Oracle数据库中使用语句级触发器对scott用户的emp表上进行增删改操作的用户进行安全检查,确保只有scott用户可以进行相关操作。 ### 回答3: 在Oracle数据库中创建语句级触发器,可以对scott用户的emp表上进行增删改操作的用户进行安全检查。一旦创建了触发器后,它将在每次对emp表进行增删改操作时触发。 首先,我们需要创建一个触发器。在触发器的代码中,我们可以使用系统提供的特殊函数USER来获取当前用户的名称。 如果当前用户不是scott用户,则触发器可以通过使用RAISE_APPLICATION_ERROR函数来抛出一个错误,阻止对emp表进行数据增删改的操作。这将强制要求只有scott用户才能执行这些操作。 触发器的代码示例如下: CREATE OR REPLACE TRIGGER emp_security_check BEFORE INSERT OR UPDATE OR DELETE ON scott.emp FOR EACH ROW DECLARE current_user VARCHAR2(30); BEGIN -- 获取当前用户的名称 current_user := USER; -- 检查当前用户是否为scott IF current_user != 'SCOTT' THEN -- 如果不是scott用户,抛出错误并阻止操作执行 RAISE_APPLICATION_ERROR(-20001, '只有scott用户有权限进行数据操作!'); END IF; END; 在触发器中,我们使用了BEFORE INSERT OR UPDATE OR DELETE语句,这意味着触发器将在每次对emp表进行插入、更新或删除操作之前执行。使用FOR EACH ROW表示该触发器将为每一行记录执行一次。 需要注意的是,触发器的创建需要足够的权限。只有具备CREATE TRIGGER权限的用户才能创建触发器。此外,还需要确保scott用户具备对emp表的适当操作权限,以便其他用户无法绕过触发器直接对emp表进行操作。 通过创建这样的触发器,可以实现对scott用户的emp表上进行增删改操作的用户的安全检查,确保只有scott用户有权限进行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值