Ja, es gibt einen Weg
Die Tabelle zum Speichern der Ergebnisse des Triggers
USE [SOME_DATABASE]
GO
CREATE TABLE [dbo].[ddl_objects_log](
[date] [datetime] NULL DEFAULT (getdate()),
[login_name] [nvarchar](128) NULL,
[nt_user_name] [nvarchar](128) NULL,
[program_name] [nvarchar](128) NULL,
[host_name] [nvarchar](128) NULL,
[text] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Der Auslöser
USE [SOME_DATABASE]
GO
/****** Object: DdlTrigger [ddl_db_trigger] Script Date: 22/01/2015 13:41:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_db_trigger]
ON DATABASE
FOR CREATE_FUNCTION,
CREATE_PROCEDURE,
CREATE_TABLE,
CREATE_TRIGGER,
CREATE_VIEW,
ALTER_FUNCTION,
ALTER_PROCEDURE,
ALTER_TABLE,
ALTER_TRIGGER,
ALTER_VIEW,
DROP_FUNCTION,
DROP_PROCEDURE,
DROP_TABLE,
DROP_TRIGGER,
DROP_VIEW,
CREATE_INDEX,
ALTER_INDEX,
DROP_INDEX
AS
BEGIN
set nocount ON
insert into ddl_objects_log(login_name, nt_user_name, program_name, host_name, text)
select login_name, nt_user_name, program_name, host_name, EVENTDATA() from sys.dm_exec_sessions WITH(NOLOCK) where session_id=@@SPID
set nocount OFF
END
GO
ENABLE TRIGGER [ddl_db_trigger] ON DATABASE
GO
Die Abfrage zum Überwachen der Ergebnisse des Triggers
USE [SOME_DATABASE]
GO
SELECT top 10
REPLACE(CONVERT(VARCHAR(250), text.query('data(/EVENT_INSTANCE/PostTime)')),'T', ' ') as modify_datetime,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/EventType)')) as event_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ServerName)')) as server_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/DatabaseName)')) as database_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectType)')) as object_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) as object_name,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/UserName)')) as user_name,
Login_name,
CONVERT(VARCHAR(MAX), text.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)')) as command_text
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
where CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) like '%SOME_STORED_PROCEDURE%'
order by date desc
GO
Ein anderer DBA mag eine andere Meinung haben, aber ich halte es für wichtig, dass diese Informationen für einen DBA verfügbar sind.
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
... Soll ich die Tabelle erstellen?Wenn Sie die Standardablaufverfolgung aktiviert haben und sie nicht verlängert wurde, können Sie damit ermitteln, wer den SP erstellt hat
Klicken Sie hier zum Vergrößern
Dies hängt davon ab, warum Sie wissen möchten, ob Objekte erstellt / geändert oder gelöscht werden. Sie können die Ereignisbenachrichtigung verwenden , um Sie zu protokollieren und zu benachrichtigen, wenn Sie der Meinung sind, dass Objekte von einem nicht autorisierten Benutzer erstellt / gelöscht oder geändert wurden. Stellen Sie sicher, dass die richtigen Filter vorhanden sind.
Der Vollständigkeit halber möchte ich erwähnen: Welche Ereignisinformationen kann ich standardmäßig von SQL Server erhalten? von Aaron Bertrand.
quelle
DATEADD(HH, -24, GETDATE())
wenn Sie Ergebnisse für mehr als 24 Stunden erhalten möchten.select * from sys.procedures where type = 'P' order by create_date desc
AND DatabaseID= 'the_Database_I_Want
, zeigt es mir nichts, auch mitDATEADD(HH, -24, GETDATE())
kommentierten. Mache ich etwas falsch?Ich komme zu spät, aber ich "mache" Sicherheits- und Verwaltungssachen.
JA . Es ist wichtig, diese Protokolle zu haben oder zu erstellen, wo immer dies möglich ist. Meiner Ansicht nach liegt es jedoch auch in Ihrer Verantwortung, diese Box erst zu öffnen, wenn sie wichtig wird. Mit anderen Worten - meiner Ansicht nach ist es Ihre Aufgabe, das Repo für Daten bereitzustellen, sicherzustellen, dass es sicher ist, dass es optimiert ist ... und sich dann von den darin enthaltenen Daten fernzuhalten, es sei denn, Sie werden ausdrücklich dazu aufgefordert Schau es dir an oder es sei denn, es ist erforderlich, um dein Ziel zu erreichen.
Meine Meinung und meine Ansicht, aber ich habe mich seit vielen Jahren mit sensiblen und vertraulichen Daten befasst und es mir zum Ziel gesetzt, fast nie [1] die Box zu öffnen, da dies das Vertrauen der Benutzer beeinträchtigt.
Lassen Sie mich jetzt einen anderen Weg einschlagen : Was ist, wenn niemand schnell herausfinden kann, wie das Verfahren auf Randfälle reagiert? Was Sie oder ich eine Stunde brauchen könnten, um zu rätseln, kann einige Minuten dauern: "Ah, richtig, dieses Ding schlägt fehl, wenn ..."
quelle