C'è un buon modo per dire chi ha creato una stored procedure in SQL Server 2005 (che funziona anche nel 2008)? In SQL Management Studio posso posizionare il mouse/le proprietà su un proc per ottenere la data/ora di creazione, ma come faccio a scoprire il creatore?Microsoft SQL Server: chi ha creato una stored procedure?
risposta
Potrebbe essere troppo tardi per te ora, ma puoi tenere traccia dell'attività DDL.
Abbiamo una tabella nel nostro database amministrativo che ottiene tutta l'attività inserita. Usa un trigger DDL, nuovo al 2005. Questi script creano una tabella nel tuo DB di amministrazione (SQL_DBA per me), creano un trigger sul modello db, creano trigger su database esistenti. Ho anche creato un'istruzione sp_msforeachDB alla fine per disabilitarli tutti.
Un avvertimento - i database devono essere in modalità di compatibilità di 90 (in opzioni per ciascun db), altrimenti è possibile che si verifichino errori. Anche l'account nella parte EXECUTE AS dell'istruzione deve essere inserito nella tabella di amministrazione.
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'
Ma se hai i permessi/ruoli impostati correttamente, come spesso ti serve questo? –
Se il sistema è chiuso, potrebbe non essere necessario. Ho questa lista spedita per me ogni giorno per i miei scopi a cui non entrerò. – Sam
+1 Cool concept. Hai dimenticato tutti i trigger DDL. Ciò potrebbe aiutare per il futuro "guardare". Ma Mitch porta un buon punto sulla sicurezza. – BuddyJoe
Credo che questo non sia disponibile in SQL 2005. Certamente non è disponibile nelle proprietà in SQL Management Studio e non è disponibile nella tabella sys.objects o in altri che posso vedere.
Se non è stato creato molto tempo fa, provate questo:
DECLARE @path varchar(256)
SELECT @path = path
FROM sys.traces
where id = 1
SELECT *
FROM fn_trace_gettable(@path, 1)
seleziona la corrente (out of the box) traccia predefinita. Se è stato creato di recente (e il server non è stato riavviato di recente), il nome dell'oggetto della procedura memorizzata e il nome di accesso che lo ha creato saranno nei dati di traccia.
@Bruno Tyndall: come sei andato? –
Questo proc è stato creato 3 anni fa. Credo che questo non funzionerebbe. Inoltre, quando ho provato a eseguirlo ho ottenuto "Non hai il permesso di eseguire" SYS.TRACES "." Credo di poter chiedere al DBA di eseguirlo. Ma... – BuddyJoe
Penso che quello che stai dicendo è che le informazioni sulle tracce vanno bene solo per circa un giorno, una settimana, forse un mese? – BuddyJoe
Lungo la stessa idea di Sam, è possibile utilizzare un trigger DDL per acquisire le informazioni necessarie, quindi inviare i dati a una coda broker di SQL servizio, che potrebbe trasmettere al database di amministrazione (che potrebbe essere il un altro server se necessario) che quindi conserverebbe tutte le modifiche DDL.
Questo eliminerebbe il problema delle autorizzazioni poiché il trigger DDL caricherà i dati in una coda di Service Broker nel database locale e SQL gestirà lo spostamento del messaggio nell'altro database.
Ci sarebbe un po 'più di setup con questo metodo, ma una volta configurato funzionerebbe, indipendentemente da chi ha modificato l'oggetto.
Come ottenere questa informazione ex post (soprattutto anni dopo) è più probabile che non sia possibile.
Tuttavia, è possibile utilizzare SQL Server Profiler per tenere traccia delle azioni DDL. In Selezione eventi, controllare i seguenti eventi:
Oggetti/Oggetto: Altered
oggetti/Oggetto: Creato
oggetti/Oggetto: soppresso
ci sono anche un sacco di opzioni di personalizzazione: è possibile salva l'output in un file o in una tabella, filtra l'output inoltre in base alle colonne ecc. ecc.
- 1. SQL Server - selezionare stored procedure
- 2. Rinominare una stored procedure in SQL Server
- 3. Se resto in SQL Server stored procedure
- 4. SQL Server Stored Procedure Cartelle/Raggruppamento
- 5. SELECT rispetto a stored procedure SQL Server
- 6. SQL Server view Stored Procedure relazioni complete
- 7. Valore restituito nella stored procedure SQL Server
- 8. SQL Server Compact Edition supporta stored procedure?
- 9. SQL Server stored procedure return code oddity
- 10. La stored procedure del server SQL restituisce una tabella
- 11. Eseguire una stored procedure in un'altra stored procedure nel server SQL
- 12. SQL Stored Procedure LIKE
- 13. Passaggio di matrice a una stored procedure di SQL Server
- 14. chiama una stored procedure SQL Server con parametro in R
- 15. Timeout quando chiamo una stored procedure di SQL Server 2008
- 16. Data ultima esecuzione su una stored procedure in SQL Server
- 17. l'esecuzione di una stored procedure Oracle da SQL Server 2008
- 18. SQL Server: variabile facoltativa in una stored procedure
- 19. SQL Server Stored procedure acquisizione valore restituito in T-SQL
- 20. caso nella stored procedure sql su SQL Server
- 21. stored procedure SQL ciclo while
- 22. Come pianificare una stored procedure?
- 23. Utilizzare la stored procedure nidificata provoca la chiamata alla stored procedure Sql Server 2008
- 24. sql server stored procedure usa varchar max come parametro
- 25. crea stored procedure se non esiste in sql server
- 26. Chiamare una stored procedure in una stored procedure in MySQL
- 27. Memorizza stored procedure di SQL Server valore restituito
- 28. Guida per principianti di stored procedure SQL Server
- 29. Ricerca testo in stored procedure in SQL Server 2005
- 30. Definizione di stored procedure estesa in MS SQL Server
Buono, Mitch. +1 – BuddyJoe