[PL/SQL]保存误删除的存储或表等对象到文件
来源:互联网 发布:ex网络用语是什么意思 编辑:程序博客网 时间:2024/06/01 22:08
在开发环境,由于多人共享一个库,而且权限管理不合理的话,很有可能出现你删除了我的存储,我删除了你的表的情况.
一般如果发现的及时,可以使用闪回技术马上闪回相应的表及数据,但是闪回具有一定的局限性:受闪回区大小限制,如果删除对象的时间过长就很有可能闪回不了了。
所以本人写了一个存储和触发器来把DROP掉的对象全部以文件的方式保存起来(相当于做了一个备份),以方便误删除对象之后的恢复.
首先,需要创建目录以存放备份的文件
create directory DDIR as 'D:\drop_back';
然后,创建存储过程
CREATE OR REPLACE PROCEDURE PROC_OUTPUTDDL(pTYPE VARCHAR2, pNAME VARCHAR2, PMESSAGE VARCHAR2, POWNER VARCHAR2 DEFAULT '') AUTHID CURRENT_USER --调用者权限 AS /* AUTHOR:Cryking Created Date: 2012-12-28 Parameter: pTYPE -- 对象类型 pNAME -- 对象名称 PMESSAGE-- 需要写入文件的信息 POWNER -- 用户 DESCRIPTION:输出存储、表、函数等对象的DDL语句到文件 */ V_FILE UTL_FILE.FILE_TYPE; V_OWNER VARCHAR2(100);BEGIN IF POWNER IS NULL THEN SELECT USER INTO V_OWNER FROM DUAL; ELSE V_OWNER := POWNER; END IF; --如果文件存在就追加内容,不存在就创建 IF DBMS_LOB.FILEEXISTS(BFILENAME('DDIR', 'DDL' || TO_CHAR(SYSDATE, 'YYYY_MM_DD') || '.LOG')) = 1 THEN V_FILE := UTL_FILE.FOPEN('DDIR', 'DDL' || TO_CHAR(SYSDATE, 'YYYY_MM_DD') || '.LOG', 'A'); ELSE V_FILE := UTL_FILE.FOPEN('DDIR', 'DDL' || TO_CHAR(SYSDATE, 'YYYY_MM_DD') || '.LOG', 'W'); END IF; UTL_FILE.NEW_LINE(V_FILE); UTL_FILE.PUT_LINE(V_FILE, 'STARTTIME[' || TO_CHAR(SYSDATE, 'YYYY_MM_DD HH24:MI:SS') || ']:'); UTL_FILE.PUT_LINE(V_FILE, PMESSAGE); UTL_FILE.PUT_LINE(V_FILE, pTYPE || ' ' || pNAME || '的DDL语句为:'); for x in (SELECT DBMS_METADATA.GET_DDL(pTYPE, pNAME, V_OWNER) A FROM DUAL) LOOP UTL_FILE.PUT_LINE(V_FILE, X.A); END LOOP; UTL_FILE.PUT_LINE(V_FILE, 'ENDTIME[' || TO_CHAR(SYSDATE, 'YYYY_MM_DD HH24:MI:SS') || ']:'); UTL_FILE.FCLOSE(V_FILE);EXCEPTION WHEN OTHERS THEN UTL_FILE.NEW_LINE(V_FILE); UTL_FILE.PUT_LINE(V_FILE, FN_GETNAME || '出现错误:' || SQLCODE || '----' || SQLERRM); UTL_FILE.FCLOSE(V_FILE); END PROC_OUTPUTDDL;
其中FN_GETNAME函数为获取当前存储过程名称,实现见本博客的另一篇文章http://blog.csdn.net/edcvf3/article/details/8050978
最后,创建系统触发器来捕捉DROP事件,注意操作需要SYSDBA权限
CREATE OR REPLACE TRIGGER DROP_DDLAFTER DDL ON database--将DROP掉的对象创建语句保存到文件BEGINIF UPPER(ORA_SYSEVENT)='DROP' THENPROC_OUTPUTDDL(ora_dict_obj_type,ora_dict_obj_name,'终端'||userenv('terminal')||'['||ORA_CLIENT_IP_ADDRESS||']在数据库**'||ora_database_name||'** 上删除了对象'||ora_dict_obj_name,ORA_LOGIN_USER);end if;end;
- [PL/SQL]保存误删除的存储或表等对象到文件
- SQL SERVER数据库导出表或查询到EXCEL文件的存储过程
- [PL/SQL]导入文件内的数据到数据库(针对本博的导出存储过程)
- PL SQL删除对象语句
- 使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码
- 使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码
- 【框架-MFC】保存HICON或HCURSOR对象到*.ico文件
- 用PL/SQL导出表,存储过程,权限等信息
- PL/SQL删除锁表的进程
- PL/SQL删除锁表的进程
- PL/SQL 找回删除的表
- 通过SQL存储过程删除过期的数据库Bak备份文件或其它文件
- Oracle 11g PL/SQL程序块,存储图片等BLOB字段类型的列PL/
- 使用DBMS_SHARED_POOL包将PL/SQL大对象保存到Shared Pool
- 很久没写过PL/SQL存储过程了--删除SQL Plan Baseline的存储过程
- 很久没写过PL/SQL存储过程了--删除SQL Plan Baseline的存储过程
- IOS AddressBook 对contact处理,一般常用到的几个文件(保存,删除,属性获取,group等)
- pl/sql developer 导出数据库中的表到可执行的.sql 脚本文件
- sysfs文件系统学习
- jQuery DOM 操作 (Manipulation)
- Linux设备驱动模型学习之基础中的基础篇
- C#QuotedStr方法实现,引号的处理
- HttpClient基于HTTP协议认证方案
- [PL/SQL]保存误删除的存储或表等对象到文件
- Ubuntu 中软件的安装、卸载以及查看的方法总结
- UIPageControl
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- 基本的数据结构学习笔记:kref
- C#中Const和Readonly的区别
- Apache搭建多站点
- jquery之设置元素内容(移动和复制元素,使用append(),appendTo()方法)
- 常见HTTP状态(304,200等)