[英]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.