मेरे पास एक ऐसी प्रणाली है जो इस प्रकार की चीज़ के लिए डीडीएल ट्रिगर का उपयोग करती है। यह मेरी जरूरतों के लिए काफी अच्छा काम करता है। यह मूल रूप से Sql Server 2005 पर विकसित किया गया था, और अब यह Sql Server 2008R2 सिस्टम पर रहता है। यह आरोन बर्ट्रेंड की टिप्पणी में लिंक द्वारा वर्णित के समान है।
इसके समान एक तालिका बनाएं।
CREATE TABLE [dbo].[SchemaLog](
[SchemaLogID] [int] IDENTITY(1,1) NOT NULL,
[PostTimeUtc] [datetime] NOT NULL,
[DatabaseUser] [nvarchar](128) NOT NULL,
[Event] [nvarchar](128) NOT NULL,
[Schema] [nvarchar](128) NULL,
[Object] [nvarchar](128) NULL,
[TSQL] [nvarchar](max) NOT NULL,
[XmlEvent] [xml] NOT NULL,
CONSTRAINT [PK_SchemaLog_1] PRIMARY KEY CLUSTERED
(
[SchemaLogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
सुनिश्चित करें कि सभी के पास टेबल पर इन्सर्ट अनुमतियाँ हैं, फिर इसके समान एक ddl ट्रिगर बनाएं।
CREATE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS
BEGIN
SET NOCOUNT ON;
DECLARE @data XML;
DECLARE @schema sysname;
DECLARE @object sysname;
DECLARE @eventType sysname;
SET @data = EVENTDATA();
SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
IF @object IS NOT NULL
PRINT ' ' + @eventType + ' - ' + @schema + '.' + @object;
ELSE
PRINT ' ' + @eventType + ' - ' + @schema;
IF @eventType IS NULL
PRINT CONVERT(nvarchar(max), @data);
INSERT [dbo].[SchemaLog] (
[PostTimeUtc]
, [DatabaseUser]
, [Event]
, [Schema]
, [Object]
, [TSQL]
, [XmlEvent] )
VALUES (
GETUTCDATE()
, CONVERT(sysname, CURRENT_USER)
, @eventType
, CONVERT(sysname, @schema)
, CONVERT(sysname, @object)
, @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
, @data );
END;
क्रम में परिवर्तन का चयन करने के लिए देखें
create view SchemaLogOrdered
as
SELECT top 10000 *
FROM dbo.SchemaLog
ORDER BY SchemaLogID DESC