一種SqlServer防止誤刪全表的觸發器設定方法

2021-10-23 01:13:46 字數 2659 閱讀 7472

0.通過乙個統計表,用來記錄你的關鍵業務表的記錄數;每次進行刪除操作時,通過建立設定的觸發器,檢索你當前操作會造成影響記錄行數和統計表種對應的記錄數進行比對,如果兩者相等或者你的基礎統計表沒有初始化記錄數,則回滾事務。然後,觸發器承擔著更新統計表對應記錄數的職責。

1.建立乙個統計表,用來記錄你的行記錄,比如我的表名叫「t_ws_func_forbiddeltable」,字段包含tablename(varchar),num_record(bigint),time_change(datetime)。tablename儲存你的關鍵業務表名,num_record表示關鍵業務表的記錄數。

2.建立如下觸發器,詳情見**注釋。

use

[asrs_zz_zt_1]

go/****** object: trigger [dbo].[tr_trans_a_di_lpt] script date: 2019/4/11 0:09:39 ******/

set ansi_nulls on

goset quoted_identifier on

go--date:2019-4-10,2019-4-11

--author:ljs,ljs

--description: 1.禁止資料表[t_trans_log_palletid_track]刪除全部資料記錄;

-- 2.記錄刪除/插入操作後,[t_trans_log_palletid_track]表的資料行數;

create

trigger

[dbo]

.[tr_trans_a_di_lpt]

on[dbo]

.[t_trans_log_palletid_track]

after

delete

,insert

asdeclare

@v_count

bigint

declare

@v_num_del

bigint

declare

@v_num_record

bigint

begin

--1.禁止資料表[t_trans_log_palletid_track]刪除全部資料記錄;

select

@v_num_del

=count(*

)from deleted;

select

@v_num_record

= isnull(num_record,0)

from t_ws_func_forbiddeltable where tablename=

't_trans_log_palletid_track'

;--@v_num_del =0,即沒有刪除任何資料行時,觸發器不起作用(避免當表的資料記錄為0,@v_num_del[數值為0]=@v_num_record[數值為0]觸發器報錯)

--@v_num_del =1,即刪除僅有的一行資料時,觸發器不起作用(避免當表的資料記錄為1,@v_num_del[數值為1]=@v_num_record[數值為1]觸發器報錯)

--如果是insert操作,則@v_num_del值為0,因此則會跳過涉及delete all的邏輯程式塊(即@v_num_del>1執行的程式語句)

if@v_num_del

>

1begin

--邏輯: 資料表刪除全部資料記錄的(危險)操作

--等價於 (不限制資料結果集=1時的刪除操作)刪除當資料表資料記錄結果集大於1,要刪除的結果集》1,資料表資料記錄結果集=要刪除的結果集

--等價於 要刪除的結果集》1,資料表資料記錄結果集=要刪除的結果集

--描述: 判斷要刪除的資料行記錄行數等於表的資料記錄行數,則認為是delete from t_trans_log_palletid_track語句沒有通過where語句進行範圍限制.

if@v_num_del

=@v_num_record

or@v_num_record=0

begin

raiserror

('你是瘋了嗎?確定資料表[t_trans_log_palletid_track]刪除全部資料記錄?',1

,1)rollback

transaction

endend

--2.記錄刪除/插入操作後,[t_trans_log_palletid_track]表的資料行數;如果是刪除全部資料記錄,則經過1的否決判斷,行數保持不變;

--t_ws_func_forbiddeltable 表的基本結構:tablename(表名)|num_record(行記錄數量)

select

@v_count=(

select

count(*

)from t_trans_log_palletid_track)

;update t_ws_func_forbiddeltable

set num_record =

@v_count

,time_change=getdate(

)where tablename =

't_trans_log_palletid_track'

end

這樣,當你不小心執行delete from 不加where的操作時,就能避免悲劇和麻煩的發生。

SQLSERVER查詢速度很慢的一種解決方案

今天資料庫一條查詢語句很慢,如下 select a.fld1,sum b.fld2 b.fld3 from table1 a left join table2 b on a.fld1 b.fld1 where 條件 group by a.fld1,b.fld3 測試得到,若不進行彙總,速度很快,但一...

每一種創傷,都是一種成熟

6.如果你準備結婚的話,告訴你一句非常重要的哲學名言 你一定要忍耐包容對方的缺點,世界上沒有絕對幸福圓滿的婚姻,幸福只是來自於無限的容忍與互相尊重。7.我的財富並不是因為我擁有很多,而是我要求的很少。8.不是某人使我煩惱,而是我拿某人的言行來煩惱自己。9.活在別人的掌聲中,是禁不起考驗的人。10.如...

每一種創傷,都是一種成熟

1.活著一天,就是有福氣,url 就該珍惜 url 當我哭泣我沒有鞋子穿的時候,我發現有人卻沒有腳。2.寧可自己去原諒別人,莫讓別人來原諒你。3.世界原本就不是屬於你,因此你用不著拋棄,要拋棄的是一切的執著。萬物皆為我所用,但非我所屬。4.別人可以違背因果,別人可以害我們,打我們,毀謗我們。可是我們...