Magic Number_咖啡寶貝???_0xCAFEBABE
最近由於在研究如何去撰寫Trigger avoid without where-clause
針對一些改善方案要去研究如何去寫這段防範 Trigger
說實在的 根本沒捨麼碰過!!!!
所以算是一項全新挑戰
爬到了
Enforce Where clause on every update statement
https://www.sqlservercentral.com/Forums/Topic1076396-145-1.aspx
這篇英文文章
下方有一位十分英明的大大Gianluca Sartori
寫的一段SQL 剛好是覺得可以派的上用場的
只不過.......
只能說 程度不太夠 還真不太能知道Gianluca Sartori大大在寫捨麼
勉強可以知道一些判斷邏輯、流程和變數使用
只不過突然看到一個感覺有點詭異的數字內容
0xCAFEBABE(「cafe babe」)
這個 字面直翻的 "咖啡寶貝" 到底是捨麼?????
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | CREATE TRIGGER MyTrigger ON MyTable FOR INSERT,DELETE,UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @program_name nvarchar(128) SELECT @program_name = program_name FROM sys.dm_exec_sessions WHERE session_id = @@spid -- Is it SSMS? IF @program_name LIKE '%Management%Studio%' BEGIN IF CONTEXT_INFO() IS NULL OR CONTEXT_INFO() <> 0xCAFEBABE BEGIN -- Accidental update? No, thanks. RAISERROR('No updates allowed here!!',16,1) ROLLBACK RETURN END ELSE BEGIN -- Explicit update, let through and reset CONTEXT_INFO. SET CONTEXT_INFO 0x0 END END END GO |
後來查詢了一下 wiki 得知
是一種常見、有名的 magic number其中之一
於Mach-O格式的文檔之中常會用來作為
通用二進位目標(Universal binary)文件之標註用途
在JAVA中也用於所有class文件開頭
0xCAFEBABE
是十進制的這個數字 3405691582
轉為十六進位後的結果
Mach-O格式的文檔
是指捨麼呢???
其實簡單來說
就是一種用於Mac OS作業系統環境的執行檔案文件格式
其層級上就跟
Linux 或 Unix的 ELF格式 (Executable and Linking Format)
是有點類似的
算是一種目的檔格式
於 Mach-O(Mach Object File Format) 的整個格式架構上
共細分成三個區塊
1.Header
2.Load commands
3.Data
為了提升效能,目的檔
通常儲存格是會避免文字格式,而是儲存為二進位格式。
主要就在於文字格式會造成IO讀取會讓效能變差~~~~
ELF可用來記錄目的檔 (object file)、執行檔 (executable file)、動態連結檔 (share object)
等等
那我在猜測可能是跟MS SQL Server底層運作機制有關
【T-SQL进阶】02.理解SQL查询的底层原理
於此篇有位對岸的大大很棒的分享了一些知識
當中有探討到事實上於MS SQL 底層
有一個 Buffer Pool
主要保有 所有緩存(命令執行計畫、資料緩存..etc)
他的示意圖畫的十分清楚值得學習
有興趣可以去看看
這邊摘習了關於T-SQL於用戶端的SSMS(SQL Server Management Studio)
執行的底層運作
會先傳至Server之網路介面
網路介面 和 用戶端介面 有一協議層
從客戶端下達指令去執行時
會先將此段 T-SQL 語句轉為 一種 TDS(Tabular Data Stream)的表格式資料流
客戶端發送TDS封包給協議層
協議層接收到TDS包後再去解壓
並遞送到關鍵引擎(包含三部分:命令解析器、查詢分析器、查詢執行器)中
分析封包裡包含了什麼指令請求
在此階段
命令解析器
會先去檢語法是否有錯 若有則回傳警訊
若無錯誤才繼續往下執行並將SQL語句轉為查詢樹給查詢分析器
查詢分析器到Buffer Pool檢查是否已經有曾經執行過的對應T-SQL執行計畫緩存
若有找到則直接從執行計畫緩存中讀取並傳給查詢執行器
沒有則在查詢執行器 中做優化並產出執行計畫存入Buffer Pool
(這也是為何同一段SQL語法 第一次下跟第二次下會發現第二次比較快的原因)
查詢執行器執行查詢
將執行計劃透過OLE DB介面傳給儲存引擎的資料訪問方法
資料訪問方法 則在去生出SQL Server可操作資料的執行程式碼並傳至緩衝區管理器
緩衝區管理器 在去讀取數據
之後在一層一層回推返回指令下達之結果給用戶端
參考連結:
Enforce Where clause on every update statement
https://www.sqlservercentral.com/Forums/Topic1076396-145-1.aspx
Hexspeak
https://zh.wikipedia.org/wiki/Hexspeak
通用二進位
https://zh.wikipedia.org/wiki/通用二进制
java魔法之0xCAFEBABE
https://leokongwq.github.io/2016/12/31/java-magic-0xCAFEBABE.html
Java Magic. Part 2: 0xCAFEBABE
http://mishadoff.com/blog/java-magic-part-2-0xcafebabe/
Why do we need a magic number in the beginning of the .class file?
编程中的「魔数」(magic number)是什么意思?平时我们能接触到哪些魔数?
https://www.zhihu.com/question/22018894/answer/151085970
mach-o文件格式分析
http://turingh.github.io/2016/03/07/mach-o文件格式分析/
趣探 Mach-O:文件格式分析
https://www.jianshu.com/p/54d842db3f69
Mach-O 文件格式探索
http://www.th7.cn/Program/IOS/201710/1260116.shtml
【T-SQL进阶】02.理解SQL查询的底层原理
http://www.cnblogs.com/jackson0714/p/SQL_Query_Mechanism.html
[MS-TDS]: Tabular Data Stream Protocol
https://msdn.microsoft.com/zh-tw/library/dd304523.aspx
sys.dm_exec_sessions (Transact-SQL)
https://docs.microsoft.com/zh-tw/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sessions-transact-sql
CONTEXT_INFO (Transact-SQL)
https://docs.microsoft.com/zh-tw/sql/t-sql/functions/context-info-transact-sql
SET CONTEXT_INFO (Transact-SQL)
https://docs.microsoft.com/zh-tw/sql/t-sql/statements/set-context-info-transact-sql
sys.dm_exec_sessions – Day 30 – One DMV a Day
http://www.sqlservergeeks.com/sys-dm_exec_sessions/
留言
張貼留言