最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL Server 添加Delete操作回滾日志方式

 更新時間:2021年01月14日 10:20:18   作者:Wikey_Zhang  
這篇文章主要介紹了SQL Server 添加Delete操作回滾日志方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我們在操作表的時候難免會遇到誤刪除,或者刪掉的數(shù)據(jù)還想恢復(fù)的情況。

也許細心的朋友會用begin tran rollback/commit 這種事務(wù)來避免出現(xiàn)失誤,但這并不是最保險的。

如果提交了事物發(fā)現(xiàn)刪錯了或者忘記提交從而導(dǎo)致表被鎖,這些問題總是不可避免的。

廢話不多說了,下面直接進入正題,通過觸發(fā)器記錄刪除日志,避免誤刪除帶來的尷尬。

下面這段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 '+@TABLENAME
		RETURN
	END
	IF (@TABLENAME LIKE'BACKUP_%' OR @TABLENAME='UPDATE_LOG' )
	BEGIN
		--PRINT'ERROR:not exist table '+@TABLENAME
		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_'+@TABLENAME AND TYPE = 'U')
	BEGIN
		--DECLARE @SQL VARCHAR(500)
		--SET @SQL='SELECT TOP 1 NEWID() AS [UpdateGUID],* INTO BACKUP_'+@TABLENAME+' FROM '+ @TABLENAME+'
		--		 DELETE FROM BACKUP_'+@TABLENAME
		--SELECT @SQL
		--EXEC(@SQL)
		DECLARE test_Cursor CURSOR FOR
		SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.columns 
		WHERE TABLE_NAME=@TABLENAME
		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 @SQLTB=@SQLTB+'['+@COLUMN_NAME+'] '+@DATA_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_'+@TABLENAME+' (UpdateGUID varchar(36),'+SUBSTRING(@SQLTB,1,LEN(@SQLTB)-1)+')'
		EXEC (@SQLTB)
		CLOSE test_Cursor 
		DEALLOCATE test_Cursor
	END
	--======================================判斷是否存在 DELETE 觸發(fā)器=========================
	IF NOT EXISTS(SELECT * FROM sys.objects WHERE NAME = 'tg_'+@TABLENAME+'_Delete' AND TYPE = 'TR')
	BEGIN
		DECLARE @SQLTR NVARCHAR(MAX)
		SET @SQLTR='
			CREATE TRIGGER tg_'+@TABLENAME+'_Delete
				ON '+@TABLENAME+'
				AFTER delete
			AS 
			BEGIN	
				SET NOCOUNT ON;
				--==============================獲取GUID==========================================
				DECLARE @NEWID VARCHAR(36)=NEWID()
				--==============================將刪掉的數(shù)據(jù)插入備份表============================
				INSERT INTO [dbo].[BACKUP_'+@TABLENAME+']
				SELECT @NEWID,* FROM deleted
				--==============================記錄日志和回滾操作的SQL===========================
				--*********************生成列名**********************
				DECLARE @COLUMN NVARCHAR(MAX)=''''
				SELECT @COLUMN+='',[''+COLUMN_NAME+'']'' FROM INFORMATION_SCHEMA.columns
				WHERE TABLE_NAME='''+@TABLENAME+''' 
				AND COLUMNPROPERTY(OBJECT_ID('''+@TABLENAME+'''),COLUMN_NAME,''IsIdentity'')<>1 --非自增字段
				SET @COLUMN=SUBSTRING(@COLUMN,2,LEN(@COLUMN))
				INSERT INTO [dbo].[UPDATE_LOG]
				SELECT @NEWID,GETDATE(),'''+@TABLENAME+''',''DELETE'',''INSERT INTO '+@TABLENAME+' SELECT ''+@COLUMN+'' FROM BACKUP_'+@TABLENAME+' WHERE UPDATEGUID=''''''+@NEWID+''''''''
			END
			'
		EXEC(@SQLTR)
	END
END

接著我們新建一張測試表,并且隨便往表中插入兩組數(shù)據(jù):

 Create table test 
 (
 id int,
 name varchar(10),
 msg varchar(10)
 )
 Insert into test
 Select 1,'aa','hahah'
 Union all 
 Select 2,'bb','heihei'

下面執(zhí)行這個SP,在給test表添加回滾日志:

EXEC SP_DELETE_LOG 'test'

細心的你不難發(fā)現(xiàn),這時候數(shù)據(jù)庫里面應(yīng)該會多出兩張表:

然后我們刪掉一條數(shù)據(jù):

DELETE FROM test WHERE id=1

再查看那兩張表:

沒錯,這時候日志表里有數(shù)據(jù)了,然后我們把 UPDATE_LOG 表中的 RollBackSQ L這一列對應(yīng)的值copy出來執(zhí)行一下:

INSERT INTO test SELECT [id],[name],[msg] FROM BACKUP_test WHERE UPDATEGUID='B0CBBC4F-3432-4D4F-9E17-F17209BF6745'

別copy我上面這段sql,因為GUID肯定是不一樣的!

然而,數(shù)據(jù)恢復(fù)了:

最后,delete日志的介紹就結(jié)束了,唯一的不滿足的是只能作用在Delete 操作,其實UPDATE 操作也同樣需要這樣的回滾日志。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • sql語句查詢數(shù)據(jù)庫中的表名/列名/主鍵/自動增長值實例

    sql語句查詢數(shù)據(jù)庫中的表名/列名/主鍵/自動增長值實例

    sql語句查詢數(shù)據(jù)庫中的表名/列名/主鍵/自動增長值實例,需要的朋友可以參考下
    2012-06-06
  • SQL Server代理服務(wù)無法啟動的解決方法

    SQL Server代理服務(wù)無法啟動的解決方法

    錯誤MSSQLSERVERSQLServerAgent could not be started (reason: SQLServerAgent 必須能夠以 SysAdmin 身份連接到 SQLServer,但“(未知)”不是 SysAdmin 角色的成員)
    2013-02-02
  • Sql注入原理簡介_動力節(jié)點Java學(xué)院整理

    Sql注入原理簡介_動力節(jié)點Java學(xué)院整理

    所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令。下面通過本文給大家分享sql 注入原理解析,感興趣的朋友一起看看吧
    2017-08-08
  • master數(shù)據(jù)庫損壞的解決辦法有哪些

    master數(shù)據(jù)庫損壞的解決辦法有哪些

    由于sqlserver 2008 master數(shù)據(jù)庫損壞導(dǎo)致sqlserver服務(wù)啟動失敗,本文給大家master數(shù)據(jù)庫損壞的解決辦法,感興趣的朋友一起參考下
    2015-10-10
  • sqlserver數(shù)據(jù)庫危險擴展刪除和恢復(fù)代碼

    sqlserver數(shù)據(jù)庫危險擴展刪除和恢復(fù)代碼

    今天為了實現(xiàn)sqlserver的復(fù)制功能,因為以前刪除了很多的sqlserver的一些會導(dǎo)致不安全因素的擴展,導(dǎo)致很多功能無法用,沒有辦法需要重新的恢復(fù)擴展。
    2010-07-07
  • SQL Server 數(shù)據(jù)頁緩沖區(qū)的內(nèi)存瓶頸分析

    SQL Server 數(shù)據(jù)頁緩沖區(qū)的內(nèi)存瓶頸分析

    數(shù)據(jù)頁緩存是SQL Server的內(nèi)存使用主要的方面,也是占用量最大的部分。在一個穩(wěn)定的DB Server上,這部分內(nèi)存使用會相對較穩(wěn)定
    2012-08-08
  • MSSQL 游標(biāo)使用 心得

    MSSQL 游標(biāo)使用 心得

    MS-SQL游標(biāo)的使用及理解 windows或DOS的“光標(biāo)”不同,MS-SQL的游標(biāo)是一種臨時的數(shù)據(jù)庫對象,既對可用來旋轉(zhuǎn)儲存在系統(tǒng)永久表中的數(shù)據(jù)行的副本,也可以指向儲存在系統(tǒng)永久表中的數(shù)據(jù)行的指針。
    2009-04-04
  • 行轉(zhuǎn)列之SQL SERVER PIVOT與用法詳解

    行轉(zhuǎn)列之SQL SERVER PIVOT與用法詳解

    這篇文章主要給大家介紹了關(guān)于行轉(zhuǎn)列之SQL SERVER PIVOT與用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用SQL SERVER具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解決SQLServer遠程連接失敗的問題

    解決SQLServer遠程連接失敗的問題

    本文介紹了SQLServer遠程連接失敗的原因以及解決方案,需要的朋友可以參考下
    2015-08-08
  • SQL Server中的事務(wù)介紹

    SQL Server中的事務(wù)介紹

    這篇文章介紹了SQL Server中的事務(wù)用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

大足县| 聂拉木县| 泰来县| 香格里拉县| 凤翔县| 台湾省| 南靖县| 牡丹江市| 汤阴县| 石门县| 礼泉县| 小金县| 三亚市| 永登县| 元阳县| 浠水县| 崇义县| 电白县| 万宁市| 江山市| 台东市| 平罗县| 花莲市| 揭东县| 松滋市| 宜昌市| 霍城县| 柞水县| 木兰县| 龙山县| 大厂| 依安县| 南岸区| 安西县| 武鸣县| 沙湾县| 兴城市| 方城县| 丰原市| 上栗县| 剑阁县|