Frage

Gibt es einen guten Weg, zu sagen, wer eine gespeicherte Prozedur in SQL Server 2005 erstellt (die auch im Jahr 2008 arbeitet)? In SQL Management Studio kann ich die rechte Maus / Eigenschaften auf einem proc das Erstellungsdatum / Zeit zu bekommen, aber wie entdecke ich den Schöpfer?

War es hilfreich?

Lösung

Es kann jetzt zu spät für Sie, aber Sie können den Überblick über DDL-Aktivität halten.

Wir haben eine Tabelle in unserer Verwaltungsdatenbank, die in ihnen alle Aktivitäten bekommt. Es verwendet einen DDL-Trigger, der neu in 2005. Diese Skripte eine Tabelle in Ihrer Admin-DB (SQL_DBA für mich) zu erstellen, erstellen einen Trigger auf dem Modell db, erstellen Trigger für vorhandene Datenbanken. Ich habe auch eine sp_msforeachDB Erklärung am Ende alle von ihnen zu deaktivieren.

Eine Einschränkung - Ihre Datenbanken müssen im Kompatibilitätsmodus von 90 (in Optionen für die einzelne db) sein, sonst können Sie beginnen, Fehler zu bekommen. Das Konto im AS Teil der Anweisung ausführen muss auch den Zugang in Ihre Admin-Tabelle einzufügen.

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'

Andere Tipps

Ich glaube, dies in SQL nicht verfügbar ist 2005. Sicherlich ist es in den Eigenschaften in SQL Management Studio nicht zur Verfügung, und in dem sys.objects Tisch oder irgendwelche andere nicht zur Verfügung ich sehen kann.

Wenn es nicht allzu langer Zeit erstellt wurde, versuchen Sie dies:

DECLARE @path varchar(256)

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

SELECT *
FROM fn_trace_gettable(@path, 1)

Sie wählt den Strom (aus der Box) default Spur. Wenn es wurde vor kurzem erstellt (und der Server neu gestartet wurde nicht vor kurzem), dann die gespeicherte Prozedur Objektnamen und den Login-Namen, die erstellt es in den Trace-Daten sein wird.

Neben der gleichen Idee wie Sams, könnten Sie einen DDL-Trigger verwenden, um die benötigten Informationen zu erfassen, dann diese Daten in eine Warteschlange SQL Service Broker senden, die es an die Admin-Datenbank weiterleiten könnte (die auf einem anderen Server sein könnten, wenn erforderlich ), die alle DDL-Änderungen dann halten würde.

Dies würde das Berechtigungsproblem entfernen, da die DDL-Trigger-Daten in eine Service Broker-Warteschlange in der lokalen Datenbank würde das Laden und SQL behandelt das Verschieben der Nachricht an die anderen Datenbank.

Es wäre ein bisschen mehr Setup mit dieser Methode, aber sobald Setup würde es funktionieren, egal, den das Objekt Änderung vorgenommen hat.

Wie dieses Stück info ex post bekommen (insbesondere Jahre später) ist höchstwahrscheinlich nicht möglich.

Sie können jedoch SQL Server Profiler verwenden DDL Aktionen zu verfolgen. In Ereignisauswahl, überprüfen Sie die folgenden Ereignisse:

Objekte / Objekt: Altered

Objekte / Objekt: Erstellt

Objekte / Objekt: entfällt

Es gibt auch viele Anpassungsmöglichkeiten. Sie die Ausgabe in eine Datei oder eine Tabelle speichern, filtern weiterhin die Ausgabe basierend auf irgendwelchen Spalten usw. usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top