oracle 触发器脚本
一、 限定仅能从指定服务器/工具连接
create or replace trigger logon_ip_module_controlafter logon on database
/*限制DATAFIX用户仅允许通过192.168.1.3的ip使用plsqldev.exe工具登录至数据库*/
declarev_ip Varchar2(50);v_user Varchar2(50);v_module Varchar2(50);v_log Varchar2(300);v_message Varchar2(300);
beginSELECT SYS_CONTEXT('USERENV', 'SESSION_USER'),SYS_CONTEXT('USERENV', 'IP_ADDRESS'),SYS_CONTEXT('USERENV', 'MODULE')into v_user, v_ip, v_modulefrom dual;if v_user = 'DATAFIX' THENIF (v_ip = '192.168.1.3' and v_module = 'plsqldev.exe') THEN-- Access Gateway null;elsev_log := 'LOGON_IP_MODULE_CONTROL_TRIGGER -- User: ' || v_user ||', IP: ' || v_ip || ', Logon tool:' || v_module;sys.dbms_system.ksdwrt(2, v_log);v_message := 'User ' || v_user ||' is not allowed to connect from this IP address or logon tool.Please contact your DBA to help.';raise_application_error(-20001, v_message);END IF;END IF;
end;
或者
**/
Create Or Replace Trigger DENY_LOGIN After Logon On Database
Declarev_Program Varchar2(48);v_Message Varchar2(1000);v_deny_Client Exception;v_deny_User Exception;v_deny_Ip Exception;
BeginSelect Program Into v_Program From V$session Where Audsid = Sys_Context('USERENV', 'SESSIONID') And Rownum < 2;If Lower(v_Program) = 'plsqldev.exe' ThenRaise v_deny_Client;End If;If User In ('SCOTT','scott') ThenRaise v_deny_User;End If;If Sys_Context('USERENV', 'ip_address') = '10.117.196.52' ThenRaise v_deny_Ip;End If;
ExceptionWhen v_deny_Client Thenv_Message := 'Sorry!You cannot access database using this software client!';Raise_Application_Error(-20001, v_Message);When v_deny_User Thenv_Message := 'Sorry!Database deny you('||User||') access,Contact DBAs please!';Raise_Application_Error(-20002, v_Message);When v_deny_Ip Thenv_Message := 'Sorry!Database deny you('||Sys_Context('USERENV', 'SESSIONID') ||') access,Contact DBAs please!';Raise_Application_Error(-20003, v_Message);When Others Thenv_Message := 'ERROR – NOT_LOGON TRIGGER- Please Contact Your DBA!!' || Sqlerrm;Raise_Application_Error(-20004, v_Message);
End;
/
二、 监控指定用户登录
其实这个可以开登录审计,这里只作为多了解一种方法。
create or replace trigger sysdba_to_alert
after logon on database
declare
message varchar2(256);
IP varchar2(15);
v_os_user varchar2(80);
v_module varchar2(50);
v_action varchar2(50);
v_type varchar2(50);
v_sql_id varchar2(50);
v_pid varchar2(10);
v_sid number;
v_program varchar2(48);
v_client_id VARCHAR2(64);
begin
IF user ='SYS' THEN-- get IP for remote connections:
if sys_context('userenv','network_protocol') = 'TCP' then
IP := sys_context('userenv','ip_address');
end if;select distinct sid into v_sid from sys.v_$mystat;
SELECT p.SPID, v.PROGRAM,v.type,v.sql_id into v_pid, v_program,v_type,v_sql_id
FROM V$PROCESS p, V$SESSION v
WHERE p.ADDR = v.PADDR AND v.sid = v_sid;v_os_user := sys_context('userenv','os_user');
dbms_application_info.READ_MODULE(v_module,v_action);v_client_id := sys_context('userenv','client_identifier');message:= to_char(sysdate,'Dy Mon dd HH24:MI:SS YYYY')||
' SYSDBA logon from '||nvl(IP,'localhost')||' '||v_sid||' '||v_sql_id||
' '||v_os_user||' '||v_client_id||' '||v_type||
' with '||v_program||' '||v_module||' '||v_action;sys.dbms_system.ksdwrt(2,message);end if;
end;
/
三、 只允许用户连到从库不允许连到主库
Create Trigger DENY_LOGINAfter Logon On Database
Declarev_db_role Varchar2(20);v_Message Varchar2(1000);v_deny_User Exception;
Beginselect DATABASE_ROLE into v_db_role from v$database;If User In ('TESTERP', 'testerp') Thenif v_db_role = 'PRIMARY' thenRaise v_deny_User;End If;End If;
ExceptionWhen v_deny_User Thenv_Message := 'Sorry! Primary database denies your user (' || User ||') to access.Please connect to the standby database.';Raise_Application_Error(-20002, v_Message);When Others Thenv_Message := 'ERROR – NOT_LOGON TRIGGER- Please Contact Your DBA.' ||Sqlerrm;Raise_Application_Error(-20004, v_Message);
End;
/
四、 限制用户在某时间段内登陆数据库
- 被限制的用户不能拥有dba权限
- 需要通过sys用户创建触发器
CREATE OR REPLACE TRIGGER limit_connection
AFTER LOGON ON DATABASE
BEGIN
IF USER='TM1' THEN
IF to_number(TO_CHAR (SYSDATE,'HH24')) BETWEEN 8 AND 22
THEN
RAISE_APPLICATION_ERROR(-20998,'CONT LOGIN BETWEEN 8-20');
END IF;
END IF;
END limit_connection;
/
五、 dg broker,让应用可以自动切换的trigger(高可用的)
create trigger myapptriggafter startup on database
declarev_role varchar(30);
beginselect database_role into v_role from v$database;if v_role = 'PRIMARY' thenDBMS_SERVICE.START_SERVICE('myapp');elseDBMS_SERVICE.STOP_SERVICE('myapp');end if;
end;
/
五、 禁止DROP、TRUNCATE操作
CREATE OR REPLACE TRIGGER TR_DISABLE_DDL
BEFORE DDL ON DATABASE
BEGINDECLARE L_FLAG INT;L_TEMPORARY VARCHAR2(50);BEGINIF ORA_SYSEVENT = 'TRUNCATE' OR ORA_SYSEVENT='DROP' THEN
/* DBMS_OUTPUT.put_line('操作类型:' || ORA_SYSEVENT || CHR(13) ||'操作对象:' || ORA_DICT_OBJ_TYPE || CHR(13) || '所属用户:' || ORA_DICT_OBJ_NAME || CHR(13) || '对象名称:' || ORA_DICT_OBJ_OWNER );*/SELECT COUNT(1) INTO L_FLAG FROM USER_TABLES WHERE TABLE_NAME=UPPER(ORA_DICT_OBJ_NAME)AND TEMPORARY='N' ;IF L_FLAG=1 THENRAISE_APPLICATION_ERROR(-20000,'You cannot TRUNCATE or DROP table: ' || ORA_DICT_OBJ_NAME);END IF;END IF;END;
END;
/
参考
https://blog.csdn.net/blogliu/article/details/79559395
ORACLE 触发器控制用户登录之权限限制_kissweety的博客-CSDN博客
oracle 触发器脚本相关推荐
- oracle触发器高级教程
[转自]http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153503 CREA ...
- oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)
oracle触发器管理: 1.概念 2.建立一个简单的触发器: 3.触发器的作用 4.触发条件 a.触发事件 b.触发时间 c.触发级别 d.触发限制 e.触发对象 5.创建及使用触发器 6.触发器分 ...
- Oracle触发器-校验身份证和字节长度
一.Oracle触发器的一个简单介绍: 触发器:是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功 能: 1.允许.限制对表的修改 2.自动生成派生列,比如自 ...
- oracle触发器 触发事件,oracle 触发器的种类和触发事件
oracle触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器 触发器的种类和触发事件 触发器必须由事件才能触发.触发器的触发事件分可为3类,分别是DML事件.DDL事件和 ...
- oracle发票验证,通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录...
我有一个SERVICE表,该表存储一个表中的服务数量,然后链接到连接到INVOICE的LINE表.通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录 我想要创建一个触发器,根据SER ...
- Oracle简单脚本演示样例
Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR VARCHAR2( ...
- linux mysql设置开机启动脚本_linux下添加oracle自启动脚本
1.修改/etc/oratab文件,后面的dbstart和dbshut依据这个文件启动数据库 soadb:/u01/oracle/product/11.2.0/dbhome_1:Y 2.创建数据库初始 ...
- Oracle 触发器调用存储过程|转||待研究|
Oracle触发器调用存储过程资料收集整理 触发器:Trigger 存储过程:Stored Procedure // ******************** 收集1 **************** ...
- SQL server与Oracle触发器的创建与使用
SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...
最新文章
- SOL注入——HTTP头部注入(六)
- (Docker实战) 第2篇:Centos7 拉取和部署Gitlab
- json转string示例_C.示例中的String.Copy()方法
- 人脸对齐(十三)--3DDFA
- A*算法(最佳优先搜索)
- python图像分类实验总结_第4章 图像分类(image classification)基础
- 计算机专业 论文检索,如何检索计算机专业论文文献
- JavaScript系列之去掉字符串前后的空格
- 商标注册的费用是多少钱
- uniapp 微信小程序开发 解决旧版本缓存
- php微信调用摄像头拍视频,公众号调用摄像头录制视频
- 群晖设置腾讯云ddns显示认证失败的两种解决办法【实测第二种成功了】
- Android开发辅助工具类 Utils
- SQL Prompt v5.3.0.3
- matlab数组保存envi,MATLAB 读取envi img格式
- 大象又要跳舞了,中国移动的用户再度加速增长
- 将一个分数拆为两个不同的单位分数之和c++算法源码
- let,const和作用域
- Nginx (5):nginx URLRewrite伪静态配置
- php日期格式和时间戳转换