全到事務(wù)的實(shí)戰(zhàn)筆記)
前言寫 SQL 這活兒誰寫誰知道。列名記不住INSERT 敲到一半停下來翻表結(jié)構(gòu)上周寫的腳本這周就忘了存在哪最刺激的還是在生產(chǎn)庫上跑 UPDATE——光標(biāo)懸在回車鍵上那兩秒心跳是真的會(huì)變快。這些坑怪不了別人一半是手生一半是工具不順手。KSQL Developer 是電科金倉做的數(shù)據(jù)庫開發(fā)管理工具主要連金倉數(shù)據(jù)庫V8R3、V8R6、V9 都行順帶也能管 Oracle、MySQL、SQL Server 的連接。我用得最多的是它那個(gè) SQL 編輯器補(bǔ)全、模板、事務(wù)、腳本管理全塞在一塊兒了。下面把編輯器挨個(gè)過一遍中間夾點(diǎn)我自己的用法。搞開發(fā)的、做運(yùn)維的都可以看看。先說說怎么打開、長什么樣打開編輯器的路子有三條。最順手的數(shù)據(jù)庫導(dǎo)航器里找到連接右鍵點(diǎn)「SQL 編輯器」新選項(xiàng)卡就出來了。想接著寫以前的腳本右鍵連接 → SQL 編輯器 → 近期 SQL 編輯器主菜單「SQL 編輯器」下面也有個(gè)一樣的入口。第三條從零開始主菜單「SQL 編輯器」→「新建 SQL 編輯器」。這里有個(gè)坑我第一次就踩了連接下的 SQL 編輯器跟右鍵表或視圖彈出來的「SQL 控制臺(tái)」不是一個(gè)東西。編輯器背后掛著 .sql 文件關(guān)了再開還在控制臺(tái)是即用即拋的關(guān)的時(shí)候手滑選了不保存東西就沒了。正經(jīng)腳本別往控制臺(tái)里寫。界面拆開看有六塊——頂部的標(biāo)簽頁、工具欄、左側(cè)行號、編輯區(qū)、滾動(dòng)條還有底部的連接控制欄。前面幾塊各家工具都長得差不多不多說。真正值得盯的是連接控制欄當(dāng)前語句跑在哪個(gè)連接上、事務(wù)什么狀態(tài)都在那行顯示。測試庫和生產(chǎn)庫同時(shí)開著的時(shí)候執(zhí)行前看一眼。能救命真事兒。Alt/ 補(bǔ)全用一次就回不去寫 SQL 累在哪我自己的感受是不在想邏輯在記名字。表名、列名、函數(shù)名全靠腦子存存不下的就得翻。KSQL Developer 的補(bǔ)全叫內(nèi)容助理Alt/ 喚出右鍵菜單里那個(gè)「SQL 內(nèi)容助理」也是它。你按名稱或者描述搜對象它去庫里找平時(shí)敲關(guān)鍵字候選列表也會(huì)自己冒出來。再講個(gè)小技巧星號展開。往一張幾十列的表里插數(shù)據(jù)先寫個(gè)骨架INSERTINTOemployee(*)括號必須有——圓的方的花的都認(rèn)。光標(biāo)放到(*后面Alt/INSERTINTOemployee(id,emp_name,dept_id,salary,hire_date,status)星號沒了整表的列名全出來了不要的刪掉就行。幾十列的表這么搞比翻結(jié)構(gòu)手敲穩(wěn)得多至少不會(huì)漏字段。模板老句子就別重寫了每個(gè)團(tuán)隊(duì)都有幾句寫到吐的 SQL分頁查詢的固定開頭、帶審計(jì)字段的 UPDATE、建表骨架。回回手敲費(fèi)時(shí)間還容易敲出個(gè)走樣的版本。模板功能就是給這個(gè)準(zhǔn)備的。編輯器里右鍵 → 「SQL 模板」列表里是現(xiàn)成的也可以在腳本里直接敲模板名按 Tab 插入或者進(jìn)列表雙擊。模板本身能增刪改位置在「窗口 → 首選項(xiàng) → KSQL Developer → 編輯器 → SQL 編輯器 → 模板」。我們組的做法是把最常用的幾個(gè)句子登記進(jìn)去新人來了一份模板列表甩過去寫出來的東西至少格式上長得一樣。比口頭說你照著某某的寫管用多了。格式化和注釋純快捷鍵的事選中一段 SQL右鍵 → 「格式」整段轉(zhuǎn)大寫或轉(zhuǎn)小寫。關(guān)鍵字大小寫統(tǒng)一了別人 review 的時(shí)候眼睛能舒服點(diǎn)。注釋兩組鍵天天用Ctrl/當(dāng)前行注釋加上再按一下去掉CtrlShift/ 管塊注釋選中一段按下加、再按去。調(diào)腳本的時(shí)候來回開關(guān)某段邏輯比手敲--利索太多了。哦對還有個(gè)冷門但好用的「變換為帶分隔符的列表」。選中文本右鍵「格式」進(jìn)去彈個(gè)框讓你設(shè)列分隔、結(jié)果分隔。我常拿它把一摞值拼成逗號分隔的串填進(jìn) IN 條件里——手動(dòng)加逗號這活兒干過的人都懂。常用的鍵湊了一張表懶得背的存著備查想干什么按什么說明跑當(dāng)前這條CtrlEnter光標(biāo)所在語句或選中的那段跑當(dāng)前這條結(jié)果單開一頁Ctrl\新結(jié)果放新選項(xiàng)卡整個(gè)腳本一起跑AltX按分號切開一條條連著執(zhí)行喚出補(bǔ)全Alt/內(nèi)容助理行注釋Ctrl/按一下加再按一下去塊注釋CtrlShift/選中的一段整體加/去存腳本CtrlS進(jìn)當(dāng)前項(xiàng)目的 Scripts 文件夾導(dǎo)腳本進(jìn)來CtrlAltShiftO從文件系統(tǒng)加載 .sql 文件腳本改名CtrlF2改當(dāng)前腳本名關(guān)結(jié)果頁CtrlShift\關(guān)當(dāng)前這個(gè)結(jié)果選項(xiàng)卡執(zhí)行 SQL 的三種跑法執(zhí)行這個(gè)動(dòng)作其實(shí)分三檔。改完一條語句想驗(yàn)證下CtrlEnter只跑光標(biāo)所在的語句或者你選中的那段整個(gè)腳本不用陪著跑。Ctrl\ 也是執(zhí)行當(dāng)前語句區(qū)別是結(jié)果會(huì)新開一個(gè)選項(xiàng)卡。前一次的結(jié)果留著新的放旁邊對比著看。調(diào) SQL 的時(shí)候特別香。第三檔是 AltX整個(gè)腳本一起跑。工具按語句分隔符默認(rèn)分號把腳本切開一條條解析、連著執(zhí)行。像這種初始化腳本一鍵完事-- init_orders.sqlCREATETABLEorders(idbigintPRIMARYKEY,cust_namevarchar(100)NOTNULL,amountnumeric(12,2),statusvarchar(20)DEFAULTOPEN,created_attimestampDEFAULTnow());INSERTINTOorders(id,cust_name,amount)VALUES(1001,張三,3800.00),(1002,李四,1250.50);UPDATEordersSETstatusPAIDWHEREid1001;分隔符這些執(zhí)行行為在「窗口 → 首選項(xiàng) → KSQL Developer → SQL 編輯器 → SQL 處理」里能改。事務(wù)生產(chǎn)庫上別用自動(dòng)提交這節(jié)多說兩句。KSQL Developer 有兩種提交模式。自動(dòng)提交語句一跑完立刻寫庫潑出去的水手動(dòng)提交改動(dòng)先攢著點(diǎn)工具欄「提交」才落地點(diǎn)「回滾」就當(dāng)無事發(fā)生。兩個(gè)模式在工具欄上切。切到自動(dòng)「提交」「回滾」倆按鈕就灰了切回手動(dòng)它們才活過來。本地開發(fā)庫自動(dòng)提交挺好省心。生產(chǎn)環(huán)境呢用手動(dòng)。工具自己也是這么想的——生產(chǎn)類型的連接默認(rèn)就是手動(dòng)提交。拿一條 UPDATE 舉例UPDATEemployeeSETsalarysalary*1.1WHEREdept_id3;自動(dòng)提交下回車即生效。等你發(fā)現(xiàn) WHERE 少寫了個(gè)條件就只能翻備份了。手動(dòng)提交留了扇后悔門先看影響行數(shù)對不對不對回滾就當(dāng)沒來過。兩種模式的差別列個(gè)表自動(dòng)提交手動(dòng)提交啥時(shí)候生效語句一跑完就寫庫點(diǎn)了「提交」才寫手滑了咋辦基本沒救點(diǎn)「回滾」一筆勾銷提交/回滾按鈕灰的按不了能用適合哪本地開發(fā)、測試庫生產(chǎn)連接默認(rèn)就它順帶講兩個(gè)配套的窗口都在工具欄「事務(wù)日志」按鈕那一帶。事務(wù)日志記的是這個(gè)會(huì)話里所有事務(wù)性操作INSERT、DELETE、UPDATE 之類??搭伾托芯G的提交成功橙的回滾了紅的出錯(cuò)沒色的是還在跑或者待定。勾上「顯示之前的事務(wù)記錄」能往前翻勾上「顯示所有查詢」連查詢類的語句也一起顯示。另一個(gè)叫待處理事務(wù)入口在「事務(wù)日志」按鈕旁邊的小箭頭。沒提交的事務(wù)是占鎖的堆多了庫就堵這窗口就是盯著它們用的。上面那張表列誰家有未提交事務(wù)下面的表顯示選中連接的明細(xì)而且能直接在這兒點(diǎn)「提交」或「回滾」。操作成功按鈕會(huì)變灰失敗給報(bào)錯(cuò)。結(jié)果面板和動(dòng)態(tài)參數(shù)一條查詢可能吐出多個(gè)結(jié)果集編輯器拿選項(xiàng)卡分開裝名字叫 Results A (B)A 是第幾條查詢B 是這條查詢的第幾個(gè)結(jié)果集。選項(xiàng)卡能拖著排順序右鍵「綁定標(biāo)簽頁」可以釘住。釘住的頁堆在左邊后面再執(zhí)行也不會(huì)蓋掉它想關(guān)得先解綁。調(diào)數(shù)據(jù)的時(shí)候把基準(zhǔn)結(jié)果釘一個(gè)新結(jié)果隨便跑兩邊不打架。關(guān)選項(xiàng)卡CtrlShift\ 關(guān)當(dāng)前的右鍵菜單里還有「關(guān)閉除此之外的所有結(jié)果選項(xiàng)卡」「關(guān)閉所有結(jié)果選項(xiàng)卡」攢了一堆的時(shí)候批量清。有時(shí)候只是想知道一條查詢會(huì)出多少行——比如跑大查詢前心里沒底——不用真執(zhí)行。選中語句菜單欄「SQL 編輯器」→「選擇行計(jì)數(shù)」只數(shù)行數(shù)不拉數(shù)據(jù)。動(dòng)態(tài)參數(shù)也好用。SQL 里寫:參數(shù)名執(zhí)行時(shí)彈框讓你填值SELECTe.emp_name,d.dept_name,e.salaryFROMemployee eJOINdepartment dONd.ide.dept_idWHEREe.dept_id:dept_idANDe.hire_date:start_date;一段 SQL 換幾個(gè)參數(shù)反復(fù)跑不用來回改字面量了。匿名參數(shù)?也行得先去「首選項(xiàng) → 編輯器 → SQL 編輯器 → SQL 處理」里把它啟用。腳本管理順便聊聊查詢管理器先說存。CtrlS存進(jìn)當(dāng)前項(xiàng)目的 Scripts 文件夾項(xiàng)目視圖里能看到。想存到文件系統(tǒng)隨便哪個(gè)位置走主菜單「SQL 編輯器 → 保存 SQL 腳本」。沒保存的修改標(biāo)題上會(huì)掛個(gè)星號編輯區(qū)左邊還有彩色高亮——哪幾行沒落盤掃一眼就知道。往回導(dǎo)按 CtrlAltShiftO或者「SQL 編輯器 → 導(dǎo)入 SQL 腳本」。改名 CtrlF2。要是把腳本改得一團(tuán)糟想從頭來右鍵 → 「文件 → 還原」直接回到磁盤上那份。默認(rèn)目錄是工作區(qū)里項(xiàng)目的 Scripts 文件夾項(xiàng)目視圖點(diǎn)「配置」能換。前面提過的 SQL 控制臺(tái)再啰嗦一句看表數(shù)據(jù)時(shí)在 SQL 控制臺(tái)中讀取數(shù)據(jù)、從 DDL 編輯器開過程或函數(shù)的源碼走的就是它。它不掛文件適合看過就扔的臨時(shí)查詢。你懂我的意思正經(jīng)東西別寫那兒。查詢管理器在「事務(wù)日志」按鈕旁的下拉里本會(huì)話跑過的查詢?nèi)趲c(diǎn)執(zhí)行的、耗時(shí)多少、影響幾行、結(jié)果如何。吵著我這條到底跑沒跑的時(shí)候翻它別翻記憶。工具欄「過濾」能按對象類型、查詢類型篩每頁條數(shù)能調(diào)日志還能落到文件里存著。最后聊兩句要我只挑一條說那就是生產(chǎn)連接手動(dòng)提交事務(wù)日志常開?;貪L按鈕就是給手滑的人留的包括我。模板這東西攢起來是團(tuán)隊(duì)的。規(guī)范寫在文檔里沒人看長在使用習(xí)慣里才真的管用??旖萱I不用全背CtrlEnter 執(zhí)行、Alt/ 補(bǔ)全、Ctrl/ 注釋這三個(gè)用熟了剩下的用到再查上面的表。編輯器說到底就是個(gè)寫語句的地方??裳a(bǔ)全省下的全是記性事務(wù)那一下回滾兜住的說不定就是你的年終獎(jiǎng)——夸張嗎不夸張。用順了每天少生點(diǎn)閑氣這總不假。