1. 程式人生 > >SQL Server新增Delete操作回滾日誌

SQL Server新增Delete操作回滾日誌

我們在操作表的時候難免會遇到誤刪除,或者刪掉的資料還想恢復的情況。也許細心的朋友會用begin tran rollback/commit 這種事務來避免出現失誤,但這並不是最保險的。如果提交了事物發現刪錯了或者忘記提交從而導致表被鎖,這些問題總是不可避免的。廢話不多說了,下面直接進入正題,通過觸發器記錄刪除日誌,避免誤刪除帶來的尷尬。

下面這段sql粘過去直接執行,建立一個儲存過程:

CREATE PROCEDURE [dbo].[SP_DELETE_LOG]
    @TABLENAME VARCHAR(50)
AS
BEGIN
	SET NOCOUNT ON;
    IF NOT EXISTS(SELECT * FROM sys.tables WHERE NAME = @TABLENAME AND TYPE = 'U' )
	BEGIN
		PRINT'ERROR:not exist table '
[email protected]
RETURN END IF (@TABLENAME LIKE'BACKUP_%' OR @TABLENAME='UPDATE_LOG' ) BEGIN --PRINT'ERROR:not exist table '[email protected] RETURN END --================================判斷是否存在 UPDATE_LOG 表============================ IF NOT EXISTS(SELECT * FROM sys.tables WHERE NAME = 'UPDATE_LOG' AND TYPE = 'U') CREATE TABLE UPDATE_LOG ( UpdateGUID VARCHAR(36), UpdateTime DATETIME, TableName varchar(20), UpdateType varchar(6), RollBackSQL varchar(1000) ) --=================================判斷是否存在 BACKUP_ 表================================ IF NOT EXISTS(SELECT * FROM sys.tables WHERE NAME = 'BACKUP_'
[email protected]
AND TYPE = 'U') BEGIN --DECLARE @SQL VARCHAR(500) --SET @SQL='SELECT TOP 1 NEWID() AS [UpdateGUID],* INTO BACKUP_'[email protected]+' FROM '+ @TABLENAME+' -- DELETE FROM BACKUP_'[email protected] --SELECT @SQL --EXEC(@SQL) DECLARE test_Cursor CURSOR FOR SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.columns WHERE
[email protected]
OPEN test_Cursor DECLARE @SQLTB NVARCHAR(MAX)='' DECLARE @COLUMN_NAME NVARCHAR(50),@DATA_TYPE VARCHAR(20),@CHARACTER_MAXIMUM_LENGTH INT FETCH NEXT FROM test_Cursor INTO @COLUMN_NAME,@DATA_TYPE,@CHARACTER_MAXIMUM_LENGTH WHILE @@FETCH_STATUS=0 BEGIN SET @[email protected]+'['[email protected]_NAME+'] '[email protected]_TYPE+CASE ISNULL(@CHARACTER_MAXIMUM_LENGTH,0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE'('+CAST(@CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10))+')' END+',' FETCH NEXT FROM test_Cursor INTO @COLUMN_NAME,@DATA_TYPE,@CHARACTER_MAXIMUM_LENGTH END SET @SQLTB='CREATE TABLE BACKUP_'[email protected]+' (UpdateGUID varchar(36),'+SUBSTRING(@SQLTB,1,LEN(@SQLTB)-1)+')' EXEC (@SQLTB) CLOSE test_Cursor DEALLOCATE test_Cursor END --======================================判斷是否存在 DELETE 觸發器========================= IF NOT EXISTS(SELECT * FROM sys.objects WHERE NAME = 'tg_'[email protected]+'_Delete' AND TYPE = 'TR') BEGIN DECLARE @SQLTR NVARCHAR(MAX) SET @SQLTR=' CREATE TRIGGER tg_'[email protected]+'_Delete ON '[email protected]+' AFTER delete AS BEGIN SET NOCOUNT ON; --==============================獲取GUID========================================== DECLARE @NEWID VARCHAR(36)=NEWID() --==============================將刪掉的資料插入備份表============================ INSERT INTO [dbo].[BACKUP_'[email protected]+'] SELECT @NEWID,* FROM deleted --==============================記錄日誌和回滾操作的SQL=========================== --*********************生成列名********************** DECLARE @COLUMN NVARCHAR(MAX)='''' SELECT @COLUMN+='',[''+COLUMN_NAME+'']'' FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='''[email protected]+''' AND COLUMNPROPERTY(OBJECT_ID('''[email protected]+'''),COLUMN_NAME,''IsIdentity'')<>1 --非自增欄位 SET @COLUMN=SUBSTRING(@COLUMN,2,LEN(@COLUMN)) INSERT INTO [dbo].[UPDATE_LOG] SELECT @NEWID,GETDATE(),'''[email protected]+''',''DELETE'',''INSERT INTO '[email protected]+' SELECT ''[email protected]+'' FROM BACKUP_'[email protected]+' WHERE UPDATEGUID=''''''[email protected]+'''''''' END ' EXEC(@SQLTR) END END
接著我們新建一張測試表,並且隨便往表中插入兩組資料:
 Create table test 
 (
	id int,
	name varchar(10),
	msg varchar(10)
 )
 Insert into test
 Select 1,'aa','hahah'
 Union all 
 Select 2,'bb','heihei'
下面執行這個SP,在給test表添加回滾日誌:
 EXEC SP_DELETE_LOG 'test'

細心的你不難發現,這時候資料庫裡面應該會多出兩張表: 然後我們刪掉一條資料:
DELETE FROM test WHERE id=1
再檢視那兩張表: 沒錯,這時候日誌表裡有資料了,然後我們把 UPDATE_LOG 表中的 RollBackSQ L這一列對應的值copy出來執行一下:
 INSERT INTO test SELECT [id],[name],[msg] FROM BACKUP_test WHERE UPDATEGUID='B0CBBC4F-3432-4D4F-9E17-F17209BF6745'
別copy我上面這段sql,因為GUID肯定是不一樣的! 然而,資料恢復了:
最後,delete日誌的介紹就結束了,唯一的不滿足的是隻能作用在Delete 操作,其實UPDATE 操作也同樣需要這樣的回滾日誌。 今天就到這裡結束了,下一篇我會介紹關於UPDATE的回滾日誌的建立。Bye Bye~~~

相關推薦

SQL Server新增Delete操作日誌

我們在操作表的時候難免會遇到誤刪除,或者刪掉的資料還想恢復的情況。也許細心的朋友會用begin tran rollback/commit 這種事務來避免出現失誤,但這並不是最保險的。如果提交了事物發現刪錯了或者忘記提交從而導致表被鎖,這些問題總是不可避免的。廢話不多說了,下

MySQL管理之道-筆記-undo log日誌物理文件空間回收

共享 想要 req .cn directory 文件 釋放 mysql5 初始化 undo log回滾日誌物理文件空間回收MySQL5.6之前undo log在ibdata1文件裏,ibdata1文件會越來越大,想要回收,必須全庫導出,刪除data目錄,再重新初始化數據庫,

SQL SERVER 新增表、新增字段、修改字段 判斷表是否存在

相關信息 not null record begin hist char use size content // 新增之前判斷表是否存在 IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE ID = OBJECT_ID(‘t

sql serverDelete 中Inner join的用法

Delete pcii From PubCalcItemInfo as pcii Inner Join PubCalcInfo as pci On pcii.CalcId=pci.CalcId where [email protected] Delete pcai From PubCal

SQL SERVER新增表註釋、欄位註釋

--為欄位添加註釋 --Eg. execute sp_addextendedproperty 'MS_Description','欄位備註資訊','user','dbo','table','欄位所屬的表名','column','添加註釋的欄位名'; execute sp_addextendedpro

sql server 新增表註釋、欄位註釋

--為欄位添加註釋  --格式如右:execute sp_addextendedproperty 'MS_Description','欄位備註資訊','user','dbo','table','欄位所屬的表名','column','添加註釋的欄位名'; execute sp_ad

sql server還原資料庫操作步驟

當其他人傳送給我們一個系統的資料庫時,我們需要在自己的機器上sql server中還原資料庫,才能在本地執行系統,檢視資料庫。具體操作步驟如下: (1)我們接收到的資料庫是一個“檔案”型別的資料 (2)開啟sql server軟體,選擇SQL Server身份驗證,輸

使用SQL Server Management Studio操作replication時,要用機器名登入,不要用IP地址

如果你在使用SSMS(SQL Server Management Studio)登入SQL Server時,使用的是IP地址,如下圖所示: 當你操作replication時,會報錯:   從上面的錯誤提示可以看出,我們只能通過機器名(server name)來登入SSMS,才能夠操

SQL Server 新增描述

新增描述的格式 exec sys.sp_addextendedproperty @name = N'MS_Description' ,@value = 'value',@level0type=N'SCHEMA',@level0name=N'dbo',@level1type=N'TABLE',@leve

MS SQL Server 2008 r2附加無ldf日誌的mdf資料庫時報1813錯誤

解決辦法:   1、首先要備份好mdf檔案,不然樂子就大了。   2、在資料庫中新建一個需要附加同名的資料庫。例如【DM】    3、停止SQL Server服務   4、找到該資料庫所在的資料夾、並刪除DM_log.ldf與DM.mdf檔案   5、 把需要附加的資料庫【D

sql server新增sa使用者和密碼

原文出處:https://jingyan.baidu.com/article/6766299787b69c54d51b84bb.html 我們有時在裝sql server 2008或者2012的時候,發現在裝的時候,忘記設定sa使用者的密碼了,其實sa使用者是sql server自帶的使用者,所

MySQL中的重做日誌(redo log),日誌(undo log),以及二進位制日誌(binlog)的簡單總結

MySQL中有六種日誌檔案, 分別是:重做日誌(redo log)、回滾日誌(undo log)、二進位制日誌(binlog)、錯誤日誌(errorlog)、慢查詢日誌(slow query log)、一般查詢日誌(general log),中繼日誌(relay log)。 其中重做日誌和回滾日誌與

sql server新增、修改字段語句(整理)

復制表結構 fault add 創建 str 可選 double 刪除列 ble 添加字段的SQL語句的寫法: 通用式: alter table [表名] add [字段名] 字段屬性 default 缺省值 default 是可選參數增加字段: alter table [

SQL Server資料庫DML操作

SQL Server資料庫DML操作 補充: 1.刪除資料庫: 例子:drop database 學生資料庫 2.刪除表 例子:drop table 學生表 1.在表中增加資料 例子: insert into學生表(學號,姓名,性別,出生日期,政治面貌) values(43,'yyw','男'

sql server 新增、查詢 欄位、表註釋

環境:xp sp3,sql server2008 1、sqlserver用語句給表註釋EXECUTE sp_addextendedproperty N'MS_Description', N'表註釋', N'user', N'dbo', N'table', N'表名',

關於SQL Server級聯操作

資料庫中有三張表:department(部門),major(專業),teacher(老師) 建立三張表: -- 建立表 -- 建立院系資訊表 use stuManage; create table department(     dNo char(6)  prim

在Spring中發生的SQL異常可以觸發事務的原因

在對Spring的事務回滾捕獲的異常型別進行測試,發現當出現SQL異常時可以觸發事務回滾,但是通過檢視文件發現,Java.lang.SQLExcepetion是Java.lang.Excepetion的子類,在沒有對事務設定rollbackfor=Exception.clas

記錄使用mysqlbinlog日誌

這兩天線上資料被誤刪除為了回滾折騰了兩天終於搞定,其中用到了mysql的binlog以此記錄一下。 之前沒有搞過mysql的mysqlbinlog查看了很多文件但是多數為簡單的教程,雖然有用但是還是相對疑惑。因此自己記錄一下希望有用。 mysqlbinlog

SQL server 練習1(SQL server 資料庫基本操作

  本篇部落格用來記錄,編者做sql server練習的題目及解答,以及遇到的一些問題和總結。 題目 1、資料庫建立 名稱:stuManage 主資料檔案: 邏輯檔名:stuManage_M_data 物理檔名:stuManage__data

MySQL 中的重做日誌日誌以及二進位制日誌的簡單總結

MySQL中有六種日誌檔案,分別是:重做日誌(redo log)、回滾日誌(undo log)、二進位制日誌(binlog)、錯誤日誌(errorlog)、慢查詢日誌(slow query log)、一般查詢日誌(general log),中繼日誌(relay log)。