Sql-Server

刪除 Query Tuning Assistant (msqta) 架構和表

  • June 10, 2021

在 SQL Server 2017 上執行查詢優化助手(使用新數據庫升級會話)時,我在相應的數據庫中創建了一個新的架構msqta,以及架構中的六個表和五個儲存過程。

在完成數據庫升級並刪除 QTA 中的所有會話、禁用 Query Store 並清除 Query Store 數據(Purge Query Data 按鈕)後,上述架構和相關對象仍然存在於數據庫中。

我進行了Google搜尋和閱讀,但找不到刪除msqta架構和相關對象的選項或命令。我猜這些對象應該在不需要時以某種方式自動刪除。在我的每個生產數據庫中都有表有點煩人。

在測試伺服器上,我嘗試手動刪除架構和對象,首先刪除表和儲存過程,然後嘗試刪除架構,但出現錯誤:

無法刪除架構“msqta”,因為它被對象“ExecutionStatType”引用。

奇怪的是,這什麼也沒返回:

SELECT * FROM sys.objects WHERE schema_id = SCHEMA_ID('msqta')

我非常感謝您對此事提出任何建議。

根據對象的名稱(ExecutionStatType),聽起來這是一個使用者定義的數據類型,通過 是不可見的sys.objects

為了展示,我將創建一個新模式,以及一個使用該模式的新類型:

use [/dev/null]
GO

CREATE SCHEMA msqta;

CREATE TYPE msqta.ExecutionStatType  
FROM varchar(11) NOT NULL ; 

現在,如果您查詢該架構sys.objectssys.types的對象,您將看到該類型僅在 sys.objects 中可見,sys.types而不是在 sys.objects 中可見:

SELECT *
FROM sys.objects
WHERE schema_id = schema_id('msqta');

SELECT *
FROM sys.types
WHERE schema_id = schema_id('msqta');

要清理這些,您只需要先刪除類型,然後刪除架構:

DROP TYPE msqta.ExecutionStatType;

DROP SCHEMA msqta;

由於 SQL Server 在刪除架構時拋出錯誤的方式,當您刪除架構時,您可能會收到針對不同類型或不同對象的類似錯誤。你需要確保你也放棄了所有這些。

如果其他人遇到同樣的問題,這裡列出了在新數據庫升級會話 (QTA) 之後需要清理的所有命令:

DROP TABLE [msqta].[ExecutionStat]
DROP TABLE [msqta].[MetaData]
DROP TABLE [msqta].[QueryOptionGroup]
DROP TABLE [msqta].[TuningSession_TuningQuery]
DROP TABLE [msqta].[TuningSession]
DROP TABLE [msqta].[TuningQuery]

DROP PROCEDURE [msqta].[spPurgeData]
DROP PROCEDURE [msqta].[spQueryGet]
DROP PROCEDURE [msqta].[spQuerySave]
DROP PROCEDURE [msqta].[spSessionById]
DROP PROCEDURE [msqta].[spSessionSave]

DROP TYPE [msqta].[ExecutionStatType]
DROP TYPE [msqta].[QueryOptionGroupType]
DROP TYPE [msqta].[TuningQueryType]
DROP TYPE [msqta].[TuningSessionType]

DROP SCHEMA [msqta]

在 SQL Server 14.0.3391.2 上測試

引用自:https://dba.stackexchange.com/questions/293922