سؤال

هل هناك وسيلة جيدة لمعرفة من إنشاء إجراء مخزن في SQL Server 2005 (الذي يعمل أيضا في عام 2008)؟ في إدارة Studio SQL يمكنني حق الماوس / الخصائص على بروك للحصول على خلق تاريخ / وقت ولكن كيف يمكنني اكتشاف الخالق؟

هل كانت مفيدة؟

المحلول

قد يكون متأخرا جدا بالنسبة لك الآن، ولكن يمكنك تتبع النشاط DDL.

لدينا جدول في قاعدة بيانات الإدارية في أن يحصل كل نشاط وضعت فيه. ويستخدم مشغل DDL، جديدة حتى عام 2005. هذه البرامج النصية إنشاء جدول في المشرف DB (SQL_DBA بالنسبة لي)، إنشاء مشغل على ديسيبل نموذج، إنشاء المشغلات على قواعد البيانات الموجودة. أنا أيضا خلق بيان sp_msforeachDB في النهاية إلى تعطيل كل منهم.

<القوي> التحذير واحدة - يمكنك قواعد البيانات الخاصة بك يجب أن تكون في وضع التوافق 90 (في خيارات لكل ديسيبل)، وإلا كنت قد تبدأ الحصول على أخطاء. الحساب في تنفيذها كجزء أيضا من البيان يحتاج أيضا الوصول إلى إدراجها في جدول المشرف.

USE [SQL_DBA]
GO
/****** Object:  Table [dbo].[DDL_Login_Log]    Script Date: 03/03/2009 17:28:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DDL_Login_Log](
    [DDL_Id] [int] IDENTITY(1,1) NOT NULL,
    [PostTime] [datetime] NOT NULL,
    [DB_User] [nvarchar](100) NULL,
    [DBName] [nvarchar](100) NULL,
    [Event] [nvarchar](100) NULL,
    [TSQL] [nvarchar](2000) NULL,
    [Object] [nvarchar](1000) NULL,
 CONSTRAINT [PK_DDL_Login_Log] PRIMARY KEY CLUSTERED 
(
    [DDL_Id] ASC,
    [PostTime] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--This creates the trigger on the model database so all new DBs get it
USE [model]
GO
/****** Object:  DdlTrigger [ddl_DB_User]    Script Date: 03/03/2009 17:26:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_DB_User] 
ON DATABASE
FOR DDL_DATABASE_SECURITY_EVENTS
AS 

DECLARE @data XML
declare @user nvarchar(100)

SET @data = EVENTDATA()
select @user = convert(nvarchar(100), SYSTEM_USER)

execute as login='domain\sqlagent'
INSERT sql_dba.dbo.DDL_Login_Log 
   (PostTime, DB_User, DBName, Event, TSQL,Object) 
   VALUES 
   (@data.value('(/EVENT_INSTANCE/PostTime)[1]', 'nvarchar(100)'), 
   @user,
    db_name(),
    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
   @data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'),
    @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(1000)')
)

GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--CREATE TRIGGER IN ALL NON SYSTEM DATABASES

DECLARE @dataname varchar(255),
@dataname_header varchar(255),
@command VARCHAR(MAX),
@usecommand VARCHAR(100)
SET @command = '';
DECLARE datanames_cursor CURSOR FOR SELECT name FROM sys.databases 
WHERE name not in ('master', 'pubs', 'tempdb', 'model','msdb')
OPEN datanames_cursor
FETCH NEXT FROM datanames_cursor INTO @dataname
WHILE (@@fetch_status = 0)
BEGIN

PRINT '----------BEGIN---------'

PRINT 'DATANAME variable: ' + @dataname;

EXEC ('USE ' + @dataname);

PRINT 'CURRENT db: ' + db_name();

SELECT @command = 'CREATE TRIGGER DBA_Audit ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
DECLARE @cmd NVARCHAR(1000)
DECLARE @posttime NVARCHAR(24)
DECLARE @spid NVARCHAR(6)
DECLARE @loginname NVARCHAR(100)
DECLARE @hostname NVARCHAR(100)
SET @data = EVENTDATA()
SET @cmd = @data.value(''(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]'', ''NVARCHAR(1000)'')
SET @cmd = LTRIM(RTRIM(REPLACE(@cmd,'''','''')))
SET @posttime = @data.value(''(/EVENT_INSTANCE/PostTime)[1]'', ''DATETIME'')
SET @spid = @data.value(''(/EVENT_INSTANCE/SPID)[1]'', ''nvarchar(6)'')
SET @loginname = @data.value(''(/EVENT_INSTANCE/LoginName)[1]'',
    ''NVARCHAR(100)'')
SET @hostname = HOST_NAME()
INSERT INTO [DBA_AUDIT].dbo.AuditLog(Command, PostTime,HostName,LoginName)
 VALUES(@cmd, @posttime, @hostname, @loginname);'

 EXEC (@command);
 FETCH NEXT FROM datanames_cursor INTO @dataname;
PRINT '----------END---------'
END
CLOSE datanames_cursor
DEALLOCATE datanames_cursor

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

----Disable all triggers when things go haywire
sp_msforeachdb @command1='use [?]; IF  EXISTS (SELECT * FROM sys.triggers WHERE name = N''ddl_DB_User'' AND parent_class=0)disable TRIGGER [ddl_DB_User] ON DATABASE'

نصائح أخرى

وأعتقد أن هذا غير متوفر في SQL 2005. ومن المؤكد أنه غير متوفر في خصائص في إدارة Studio SQL، وغير متوفر في الجدول sys.objects أو أي أشخاص آخرين أستطيع أن أرى.

إذا لم يكن إنشاؤه منذ فترة طويلة جدا، حاول هذا:

DECLARE @path varchar(256)

SELECT @path = path
FROM sys.traces
where id = 1

SELECT *
FROM fn_trace_gettable(@path, 1)

ويختار الحالية (من خارج منطقة الجزاء) أثر الافتراضية. إذا تم إنشاؤه مؤخرا (ولم يتم إعادة تشغيل الملقم مؤخرا)، ثم إجراء مخزن اسم الكائن واسم تسجيل الدخول التي تم إنشاؤها سيكون في بيانات التتبع.

وعلى نفس الفكرة باعتبارها سام، هل يمكن استخدام مشغل DDL لالتقاط المعلومات المطلوبة، ثم ترسل تلك البيانات إلى قائمة انتظار وسيط الخدمة SQL، والتي يمكن إرسالها إلى قاعدة البيانات الادارية (التي يمكن أن تكون على خادم آخر إذا لزم الأمر ) التي من شأنها ثم محاسبة كل التغييرات DDL.

وهذا من شأنه أن يزيل هذه القضية الأذونات مثل الزناد DDL سيتم تحميل البيانات في خدمة وسيط قائمة انتظار في قاعدة البيانات المحلية وSQL يعالج تحريك الرسالة إلى قاعدة بيانات أخرى.

وسوف يكون هناك أكثر قليلا الإعداد مع هذا الأسلوب، ولكن بمجرد الإعداد انها ستعمل بغض النظر عن الذي أجرى التغيير الكائن.

وكيفية الحصول على هذه القطعة من آخر المعلومات السابق (لاحقا خصوصا عاما) هو الأكثر احتمالا غير ممكن.

ومع ذلك، يمكنك استخدام SQL Server منشئ ملفات التعريف لتتبع إجراءات DDL. في اختيار الحدث، والتحقق من الأحداث التالية:

وكائنات / القطعة: غيرت

وكائنات / القطعة: مكون

وكائنات / القطعة: محذوفة

وهناك أيضا الكثير من خيارات التخصيص: يمكنك حفظ الإخراج إلى ملف أو الجدول، تصفية الإخراج استنادا علاوة على أية أعمدة الخ الخ

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top