有時(shí)候我們數(shù)據(jù)庫(kù)表中的數(shù)據(jù)會(huì)莫名其妙的被刪除,不知道是業(yè)務(wù)問(wèn)題還是被黑了,所以我們想要在數(shù)據(jù)庫(kù)操作層面對(duì)此進(jìn)行制止,同時(shí)記錄操作的日志,我們可以利用觸發(fā)器來(lái)實(shí)現(xiàn)這個(gè)需求,測(cè)試數(shù)據(jù): if not object_id(N'T') is null Create table T([ID] int,[姓名] nvarchar(22)) --測(cè)試數(shù)據(jù)結(jié)束
新建日志表: ID INT NOT NULL IDENTITY(1, 1) , EVTIME DATETIME NOT NULL DEFAULT ( GETDATE() ) , --訪問(wèn)時(shí)間 [SQL] VARCHAR(300) , --執(zhí)行的SQL語(yǔ)句 USERID VARCHAR(128) NOT NULL DEFAULT ( SUSER_SNAME() ) , --連接的時(shí)候使用的哪個(gè)SQL登陸用戶 HOSTNAME VARCHAR(128) NOT NULL DEFAULT ( HOST_NAME() ) , --客戶端的機(jī)器名 LOGINID VARCHAR(128), --客戶端的登陸用戶(OS的用戶) APPNAME VARCHAR(128)NOT NULL DEFAULT ( APP_NAME()) --是從查詢分析器,還是應(yīng)用程序來(lái)執(zhí)行的
新建觸發(fā)器: CREATE TRIGGER TR_TBTEST ON T RAISERROR('錯(cuò)誤',16,8) DECLARE @SPID VARCHAR(20) SET @SPID = CAST(@@SPID AS VARCHAR) EXEC ( 'DBCC INPUTBUFFER (' + @SPID + ')' DECLARE @USERID VARCHAR(128) , --連接的時(shí)候使用的哪個(gè)SQL登陸用戶 @HOSTNAME VARCHAR(128) , --客戶端的機(jī)器名 @LOGINID VARCHAR(128) , --客戶端的登陸用戶(OS的用戶) @APPNAME VARCHAR(128) --是從查詢分析器,還是應(yīng)用程序來(lái)執(zhí)行的 SELECT @USERID = LOGINAME , --連接的時(shí)候使用的哪個(gè)SQL登陸用戶 @HOSTNAME = HOSTNAME , --客戶端的機(jī)器名 @LOGINID = NT_USERNAME , --客戶端的登陸用戶(OS的用戶) @APPNAME = PROGRAM_NAME --是從查詢分析器,還是應(yīng)用程序來(lái)執(zhí)行的 FROM MASTER..SYSPROCESSES
測(cè)試刪除: DELETE FROM T WHERE id=1
結(jié)果:
查詢?nèi)罩竞蛿?shù)據(jù)情況:
結(jié)果: 
以上實(shí)現(xiàn)了我們想要的禁止刪除并添加日志的功能,當(dāng)然我們也可以把這個(gè)應(yīng)用到INSERT、UPDATE等操作中。
|