Sql-Server

如何找出導致架構更改的原因?

  • January 19, 2018

我正在調查我的 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) 您可以根據需要保留歷史記錄(預設跟踪會翻轉)。

這是從我在這裡寫的一個技巧中挑選出來的。

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