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 server中Delete 中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)。