SQL Search 的範圍
工具窗上兩顆按鈕決定這一輪搜哪裡:伺服器與資料庫;左邊那一顆圖示鈕把兩者一次套用成查詢視窗 的連線(與 SQL Memory 同一顆,規則見視窗骨架)。契約與 provider 見 SQL Search。
這三顆是工具列範圍層(搜尋列上面那一層)的第一群。範圍層依問題分三群:套用 伺服器 資料庫(搜哪裡)|種類(搜什麼)| 名稱 內容 欄位(比對哪裡)。每一顆之間都看得到線,而群間那一條比群內的高一截、寬一截, 兩級的規格與換行規則見篩選:全部畫成同一種的那一版, 使用者會把種類讀成第三個範圍條件。列首與分段開關換到第三列時它前面那一條都收起, 不留一條開頭的孤線。
兩顆按鈕是明確的值
伺服器與資料庫都是使用者選定的值,規則與 SQL Memory 共用一份(Core/Connections/SqlConnectionScope)。 沒有「跟著查詢視窗」這種會自己變的選項:切分頁、在查詢視窗換連線都不動範圍,只有勾選與 套用按鈕會換。跟著走的那一版,使用者盯著同一組篩選,搜到的卻隨他剛點過哪個分頁而不同; 兩套語意(跟著走/指名)並存時,摘要還得各說一句「查詢視窗(…)」「連線預設(…)」才分得出來。
- 伺服器單選:換一台換的是整份目錄。下拉列出目前連得上的每一台——物件總管上已連線的, 加上查詢視窗連著而樹上沒有的那一台;同一台只列一行(
SqlSearchCatalogs.IsSameServer)。 選的那一台已經不在兩處時照樣列出來,否則看不出現在搜的是哪一台。還沒選時摘要是「未選擇」。 - 資料庫多選,沒勾就是「全部」:這台上這個登入進得去、在線上的每一個。摘要一個寫名字、 多個寫數量。換伺服器就清掉勾選的資料庫:名稱是每台自己的,帶著上一台的勾選搜這一台, 每個都回「不存在」。
- 套用按鈕:伺服器換成查詢視窗連著的那一台、資料庫換成它連著的那一個,用的是查詢視窗 那條連線(
SqlSearchCatalogs.ReadActiveEditorAsync),所以物件總管上沒有的那一台也搜得到。 抓下來的是註冊表裡的編輯器目錄:它不會被淘汰,連線來源是複製出來的樣板,視窗關掉照樣可用。 先等中繼資料服務確認連線再抓,否則剛換過連線的視窗交出的是上一台的目錄。
還沒選伺服器時自動套用一次:開窗、選的那一台從物件總管中斷,以及還沒選時切到有連線的分頁。 自動那一次查詢視窗沒有連線就安靜地什麼都不做;等確認的途中使用者自己挑了一台就不蓋掉他。 選定之後就不再跟。
什麼時候重讀範圍
範圍只在使用者換它的時候換,所以作廢重搜只有一條路(ScopeChanged):目錄換了(由 SqlSearchProviders.UseConnection 回答)就先清掉清單,否則這一台還在建索引的那幾秒,摘要寫著 這一台,下面列的卻是上一台的物件。預覽的定義快取不跟著清:它的鍵是那一筆自己的伺服器、資料庫與編號。
切換分頁(ActiveSqlEditor.Changed)與同一個分頁裡換連線(SqlEditorConnectionWatcher.Changed) 不動範圍,只重算每一列「移至定義會不會開未連線的視窗」(見結果導航), 以及還沒選伺服器時的自動套用。後者每批 F5 都發一次,所以這一條路上不重搜。
目錄與伺服器一次交出(SqlSearchConnection)。分開問的話,換台那一段裡名字已經是新的 那一台、目錄卻還是上一台:清單列著上一台的物件卻標成新的一台,在物件總管中選取找不到, 移至定義還會沿用錯的連線。
資料庫清單從哪裡來
面板的清單走 SqlCatalogSearchDatabases.TryList,在面板展開時才問。不讀 SqlMetadataCatalog.CachedSnapshot:那一份是補全在按鍵路徑上載入的,選物件總管上一台 伺服器時它從頭到尾是空的——下拉一個選項都沒有。
展開下拉就是使用者在要求這份清單,所以那一刻去問資料庫是對的;禁止的是在沒有人打開它的 時候先問(每個查詢視窗一次),以及打開就把每一個都先索引一遍。
範圍是「全部」時,要搜哪幾個由 provider 每一輪自己問同一條查詢(SqlCatalogSearchProvider), 不讀面板那一份:剛建好或剛卸除的資料庫下一輪就對得上。問不到時照實說這一輪沒有搜任何資料庫, 不退回只搜連線那一個——那一份答案看起來完全正常,只是少了使用者以為有搜的其他資料庫。 第一輪要把每一個都索引一遍,載入表面照面板手上那份清單判斷,還不知道有哪幾個就當成要掃。
面板那一份只留目前這條連線;換連線在範圍換了那一刻就同步(SyncTo),不是等到展開下拉才比對—— 比對藏在重問裡的那一版,換一台之後「問過了」仍是上一台的答案,宿主據此提早收工,下拉從此畫著 上一台的資料庫,而且不會自己好。按「重新整理」也重問。問不到時留住上一份並在清單上方 說一句,不清空:清空等於說「這台伺服器上一個都進不去」,而那與「這一次問不到」是兩件事, 下一步也不同。已經勾起來的名稱一律列得出來,就算不在這一份清單裡,否則使用者取消不掉自己剛選 的條件。實作在 Ssms22/Search/SqlSearchScopeDatabases.cs。
清單還在路上時面板先說一句(SqlBusyNotice),不先給一份空的:空面板與「這台上一個都沒有」 在畫面上一模一樣,而使用者會關掉它去別的地方找。
沒有連線時的出口
還沒選伺服器與選的那一台連不上,下一步都是換一台,所以狀態表面只有一顆「選擇伺服器」 (SqlSurfaceState.ActionLabel),按下去打開伺服器面板;還沒選時那一句同時點出套用按鈕。 只說一句話而把出口留在別的選單裡,等於要使用者先猜出問題出在範圍上。
選的那一台連不上時不退回查詢視窗那一台:退回去的答案看起來完全正常,只是來自另一台伺服器。 開窗時也不替他打開伺服器面板:物件總管服務第一次取用會把它的工具視窗叫出來,而使用者可能 正是把它關掉的人,所以這一步一定由他發動。
關掉重開不記得的那幾項
伺服器、資料庫與物件種類不記。前兩者綁在一條連線上:記住之後換一台,工具窗會對一個不在 這台上的資料庫每一輪都回報「讀不到」;重開時自動套用查詢視窗那一條比記住上一次更接近他現在 在做的事。種類是一次調查裡的收斂,不是長期的工作方式;記住它的症狀是下星期打開視窗搜 Loan, 那張表因為上次勾過別的種類而不在。記得的那三項見SQL Search。