簡體   English   中英

SQL存儲過程更改日志記錄觸發器未保存所有文本

[英]SQL stored procedure change logging trigger not saving all text

我創建了一個存儲過程來記錄對存儲過程所做的更改。 問題在於,較大的那些並沒有全部保存下來,而是被砍掉了。

我需要能夠保存整個過程文本,並且它還可以用作還原先前版本的方法。

觸發:

/****** Object:  DdlTrigger [StoredProcUpdateInsert]    Script Date: 12/05/2015 14:05:05 ******/
DROP TRIGGER [StoredProcUpdateInsert] ON DATABASE
GO

/****** Object:  DdlTrigger [StoredProcUpdateInsert]    Script Date: 12/05/2015 14:05:05 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE TRIGGER [StoredProcUpdateInsert]
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE

AS
BEGIN
SET NOCOUNT ON


DECLARE @data XML
SET @data=EVENTDATA()

INSERT INTO dbo.ProcedureChanges
        ( ProcName ,
          ProcText ,
          ModifiedBy ,
          DateTimeLastUpdated
        )
VALUES  ( @data.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)') , -- ProcName - nvarchar(450)
          (SELECT TOP 1 text FROM syscomments WHERE id=OBJECT_ID(@data.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)'))) , -- ProcText - nvarchar(max)
          @data.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(max)') , -- ModifiedBy - nvarchar(250)
          GETDATE()  -- DateTimeLastUpdated - datetime
        )



END 


GO

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER OFF
GO

ENABLE TRIGGER [StoredProcUpdateInsert] ON DATABASE
GO

根據本文: https : sys.sqlmodules您不應使用syscomments ,而應使用sys.sqlmodules

上面文章中syscomments.text的定義說它的定義是nvarchar(4000) 大概這意味着所有長度超過4000個字符的DDL都會被截斷,因此,您只能在日志表中獲取前4000個字符。

我尚未對此進行測試,但是您可以嘗試:

INSERT INTO dbo.ProcedureChanges
        ( ProcName ,
          ProcText ,
          ModifiedBy ,
          DateTimeLastUpdated
        )
VALUES  ( @data.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)') , -- ProcName - nvarchar(450)
          (SELECT Definition FROM sys.sql_modules WHERE object_id=OBJECT_ID(@data.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)'))) , -- ProcText - nvarchar(max)
          @data.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(max)') , -- ModifiedBy - nvarchar(250)
          GETDATE()  -- DateTimeLastUpdated - datetime
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM