下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當(dāng)前位置:軟件下載吧 > 數(shù)據(jù)庫(kù) > MS_SQL > SQL開(kāi)發(fā)知識(shí):SQL Server 添加Delete操作回滾日志方式

          SQL開(kāi)發(fā)知識(shí):SQL Server 添加Delete操作回滾日志方式

          時(shí)間:2024-02-05 12:47作者:下載吧人氣:23

          我們?cè)诓僮鞅淼臅r(shí)候難免會(huì)遇到誤刪除,或者刪掉的數(shù)據(jù)還想恢復(fù)的情況。

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

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

          廢話不多說(shuō)了,下面直接進(jìn)入正題,通過(guò)觸發(fā)器記錄刪除日志,避免誤刪除帶來(lái)的尷尬。

          下面這段sql粘過(guò)去直接運(yùn)行,建立一個(gè)存儲(chǔ)過(guò)程:

          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

          標(biāo)簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫(kù),SQLSERVER

          相關(guān)下載

          查看所有評(píng)論+

          網(wǎng)友評(píng)論

          網(wǎng)友
          您的評(píng)論需要經(jīng)過(guò)審核才能顯示

          熱門閱覽

          最新排行

          公眾號(hào)

          主站蜘蛛池模板: 亚洲欧美一区二区三区日产| 免费高清在线影片一区| 精品国产一区二区麻豆| 色窝窝无码一区二区三区| 国模无码一区二区三区| 国产成人精品a视频一区| 精品国产精品久久一区免费式| 少妇无码一区二区三区免费| 国产精品福利一区| 亚洲av无码一区二区三区四区 | 文中字幕一区二区三区视频播放| 日韩视频免费一区二区三区| 中字幕一区二区三区乱码| 无码精品一区二区三区免费视频 | 人妻体内射精一区二区| 一区二区三区无码被窝影院| 麻豆天美国产一区在线播放| 一区二区视频在线观看| 亚洲日本一区二区| 91精品一区国产高清在线| 亚洲国产精品一区二区九九| 无码少妇一区二区浪潮av| av无码精品一区二区三区四区| 精品视频一区二区三区在线播放| 国精产品一区一区三区MBA下载 | 久久影院亚洲一区| 国产成人一区二区精品非洲| 国产日韩视频一区| 一区二区中文字幕在线观看| 国产一区三区三区| 久久综合精品不卡一区二区| 亚洲成AV人片一区二区| 国产亚洲日韩一区二区三区| 亚洲av无码不卡一区二区三区| 久久国产精品一区免费下载| 日本视频一区在线观看免费| 国产吧一区在线视频| 在线电影一区二区| 综合无码一区二区三区| 日韩人妻精品无码一区二区三区 | 精品伦精品一区二区三区视频 |