mysql 触发器不能同时 insert or update or delete_运维日记|SQL server 那点事——DML触发器...
11月19日,21點(diǎn),小編正六指霸屏,決賽圈1V4,忽然,電話響了,這種感覺很熟悉,不錯,上次差點(diǎn)推掉對面水晶的那一幕又上演了……作為一名美創(chuàng)的員工,客戶才是第一位,我毫不猶豫的摁下了接聽鍵。
?
XXX嗎?我數(shù)據(jù)庫有人篡改了某張表,我一聽,這個問題應(yīng)該難度不大(自信ing!),趕緊回應(yīng)客戶:
您數(shù)據(jù)庫有保留最近一次完整備份以及之后的完整日志嗎?
1、有的話可以用完整備份恢復(fù)+日志備份(誤操作前的LSN恢復(fù))
2、也可以通過sys.fn_dblog()獲取二進(jìn)制日志,再解析出來誤操作的語句進(jìn)行恢復(fù)
結(jié)果客戶的需求并不是該操作如何恢復(fù),而是想確定這個篡改表的始作俑者,以及如何去記錄以后數(shù)據(jù)庫這種類似的情況。我很清楚的告訴客戶,再沒部署任何監(jiān)控記錄的基礎(chǔ)上,解析日志也只能獲取相關(guān)的數(shù)據(jù)記錄,無法獲取更過的信息(當(dāng)然,不排除某種高端工具可能會獲取)。
至于以后如何防患,如何記錄,這個可以通過SQL server觸發(fā)器或者審計(jì)功能來實(shí)現(xiàn),而本文,將著重介紹DML觸發(fā)器以及它如何實(shí)現(xiàn)客戶的需求,請看下文。
01
DML觸發(fā)器介紹
DML觸發(fā)器是一種特殊類型的存儲過程,它在指定的表中的數(shù)據(jù)發(fā)生變化時(shí)自動生效。喚醒調(diào)用觸發(fā)器以響應(yīng) INSERT、UPDATE 或 DELETE 語句。
02
常見的DML觸發(fā)器
2.1 創(chuàng)建語句
2.2 插入測試
可見,因?yàn)橛|發(fā)器的緣故,不滿足要求的數(shù)據(jù)無法插入(這里的age>=100雖有悖常理,實(shí)則祝大家都長命百歲,哈哈)
回到我們的主旨,這種觸發(fā)器雖然能起到防患的作用,但是依舊無法達(dá)到我們預(yù)期的效果,我們不僅要防患于未然,更要能事事追蹤溯源,話不多說,請看下文,也是我們這篇文章最最重要的干貨!!!
03
如何用DML觸發(fā)器記錄操作
實(shí)現(xiàn)原理:
DML操作記錄,簡單的說,就是日志類觸發(fā)器,也就是盡量全面地反映數(shù)據(jù)庫表所進(jìn)行的insert、update、delete操作,便于日后翻閱。
1、創(chuàng)建測試表:
2、創(chuàng)建DML日志表:
3、創(chuàng)建DML觸發(fā)器:
4、查看當(dāng)前觸發(fā)器日志表:
5、用hostnameadministrator執(zhí)行DML操作:
執(zhí)行結(jié)果為:
6、再用dsz登錄執(zhí)行DML操作:
執(zhí)行結(jié)果為:
7、查看DML日志表:
顯而易見,剛才的6次insert,2次update(一次update對應(yīng)兩條記錄,因?yàn)榉謩e記錄了name的更改前后的值—),以及2次delete,都清楚的記錄在該表內(nèi)。
眼尖的網(wǎng)友可能要問,USERID和HOSTNAME很清楚,最后這兩列有什么特殊的含義嗎?
我們的觸發(fā)器日志表如果僅僅記錄一些基礎(chǔ)的信息,還遠(yuǎn)遠(yuǎn)不夠,我們還要將更改的數(shù)據(jù)挖掘出來,以便在需要的時(shí)候進(jìn)行逆向DML。
那么,我們是不是也可以修改日志表,添加更多我們需要捕獲的信息呢,答案是肯定的,不過這個就交給廣大網(wǎng)友去探索、去更改了……
8、truncate 掉test表,再查看DML日志表:
可以看到,依舊只有12條記錄,這是為什么呢?明明test的表都被刪干凈了啊???
莫慌莫慌,大家都知道,truncate和delete不同,它屬于DDL語句,所以,關(guān)于DDL的觸發(fā)器,且看下回分解,不要走開哦。
美創(chuàng)運(yùn)維中心數(shù)據(jù)庫服務(wù)團(tuán)隊(duì)擁有Oracle ACE 1人、OCM 10余人、數(shù)十名Oracle OCP、MySQL OCP、紅帽RHCA、中間件weblogic、tuxedo認(rèn)證、達(dá)夢工程師 ,著有《Oracle DBA實(shí)戰(zhàn)攻略》,《Oracle數(shù)據(jù)庫性能優(yōu)化方法和最佳實(shí)踐》,《Oracle內(nèi)核技術(shù)揭秘》等多本數(shù)據(jù)運(yùn)維優(yōu)化書籍。目前運(yùn)維各類數(shù)據(jù)庫合計(jì)2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、達(dá)夢等主流商業(yè)和開源數(shù)據(jù)庫。并成為首批國內(nèi)達(dá)夢戰(zhàn)略合作伙伴之一,擁有海量經(jīng)驗(yàn)和完善的人員培養(yǎng)體系。并同時(shí)提供超融合,私有云整體解決方案。
轉(zhuǎn)自杭州美創(chuàng)科技有限公司公眾號,如需二次轉(zhuǎn)載,請聯(lián)系marketing@mchz.com.cn
總結(jié)
以上是生活随笔為你收集整理的mysql 触发器不能同时 insert or update or delete_运维日记|SQL server 那点事——DML触发器...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python百度地图api经纬度_从百度
- 下一篇: python判断txt文件是否为空_Py