Sql-Server
如何找出導致架構更改的原因?
我正在調查我的 SQL Server 2008 R2 伺服器上的一些性能問題。由於“架構更改”,一些查詢正在重新編譯。我很確定沒有人在更改架構。此伺服器上的所有數據庫都啟用了全文。
問題是:我怎樣才能找到導致模式發生變化的原因?是否有任何查詢 oy profiler 列可以告訴我發生了什麼?
您可以使用 DDL 觸發器來記錄架構更改。
CREATE DATABASE AuditDB; GO USE AuditDB; GO CREATE TABLE dbo.DDLEvents ( EventDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, EventType NVARCHAR(64), EventDDL NVARCHAR(MAX), EventXML XML, DatabaseName NVARCHAR(255), SchemaName NVARCHAR(255), ObjectName NVARCHAR(255), HostName VARCHAR(64), IPAddress VARCHAR(32), ProgramName NVARCHAR(255), LoginName NVARCHAR(255) );
然後在您的數據庫中,您可以將事件添加到 DDL 觸發器:
CREATE TRIGGER DDLTrigger_Sample ON DATABASE FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, CREATE_TABLE, ALTER_TABLE, DROP_TABLE, CREATE_VIEW, ALTER_VIEW, DROP_VIEW --, etc etc AS BEGIN SET NOCOUNT ON; DECLARE @EventData XML = EVENTDATA(); DECLARE @ip VARCHAR(32) = (SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID); INSERT AuditDB.dbo.DDLEvents ( EventType, EventDDL, EventXML, DatabaseName, SchemaName, ObjectName, HostName, IPAddress, ProgramName, LoginName ) SELECT @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'), @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'), @EventData, DB_NAME(), @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'), @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'), HOST_NAME(), @ip, PROGRAM_NAME(), SUSER_SNAME(); END GO
與審計相比的優勢在於它不需要企業版。與預設跟踪相比的優點是 (a) 您可以控制要擷取的事件,以及 (b) 您可以根據需要保留歷史記錄(預設跟踪會翻轉)。
這是從我在這裡寫的一個技巧中挑選出來的。