Wer hat ein Verfahren erstellt? (SQL Server 2008 R2)


10

Gibt es eine Möglichkeit aufzulisten, wer bestimmte Beschaffungen in SQL Server 2008 erstellt hat?

In diesem SO-Link gibt es einige Antworten, aber von vor 6 Jahren.

Ich weiß, dass es am besten ist, Ihren Namen und Ihr Datum zu schreiben und dann mit der Erstellung der Prozedur zu beginnen, aber ich sehe dies nicht dort, wo ich arbeite.

Wenn dies nicht möglich ist, kann diese Aufgabe mit Triggern ausgeführt werden?

Und eine Bonusfrage. Ist das der Job eines DBA? zu wissen, wer es geschaffen hat?

Vielen Dank.

Antworten:


7

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.


Hallo. Vielen Dank für die schnelle Antwort. Ich werde hier einen kleinen Test machen.
Racer SQL

@craig ... Ich habe hier Probleme FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Soll ich die Tabelle erstellen?
Racer SQL

Dies ist möglich, wenn ein Trigger vorhanden ist, der ihn aufzeichnet. Die Standardablaufverfolgung (sofern Sie sie nicht explizit deaktiviert haben) wird bereits ausgeführt und erfasst die Ereignisse (es sei denn, sie wird verschoben und die Informationen werden gelöscht).
Kin Shah

@ RafaelPiccinelli Ich habe die Tabelle SQL-Code hinzugefügt
Craig Efrein

Danke @CraigEfrein ... @ kin, ich habe "Standard-Trace aktiviert = 1". Ich habe Ihren Kommentar nicht verstanden. Dieser Trigger funktioniert nur, wenn ich bereits einen anderen Trigger habe? Entschuldigung, ich bin neu in der Sicherheitswelt.
Racer SQL

3

Wenn Sie die Standardablaufverfolgung aktiviert haben und sie nicht verlängert wurde, können Sie damit ermitteln, wer den SP erstellt hat

/*
    Object Altered
    Object Created
    Object Deleted 
*/

SELECT  TE.name ,

        v.subclass_name ,

        DB_NAME(t.DatabaseId) AS DBName ,

        T.NTDomainName ,

        t.NTUserName ,

        t.HostName ,

        t.ApplicationName ,

        t.LoginName ,

        t.Duration ,

        t.StartTime ,

        t.ObjectName ,

        CASE t.ObjectType

          WHEN 8259 THEN 'Check Constraint'

          WHEN 8260 THEN 'Default (constraint or standalone)'

          WHEN 8262 THEN 'Foreign-key Constraint'

          WHEN 8272 THEN 'Stored Procedure'

          WHEN 8274 THEN 'Rule'

          WHEN 8275 THEN 'System Table'

          WHEN 8276 THEN 'Trigger on Server'

          WHEN 8277 THEN '(User-defined) Table'

          WHEN 8278 THEN 'View'

          WHEN 8280 THEN 'Extended Stored Procedure'

          WHEN 16724 THEN 'CLR Trigger'

          WHEN 16964 THEN 'Database'

          WHEN 16975 THEN 'Object'

          WHEN 17222 THEN 'FullText Catalog'

          WHEN 17232 THEN 'CLR Stored Procedure'

          WHEN 17235 THEN 'Schema'

          WHEN 17475 THEN 'Credential'

          WHEN 17491 THEN 'DDL Event'

          WHEN 17741 THEN 'Management Event'

          WHEN 17747 THEN 'Security Event'

          WHEN 17749 THEN 'User Event'

          WHEN 17985 THEN 'CLR Aggregate Function'

          WHEN 17993 THEN 'Inline Table-valued SQL Function'

          WHEN 18000 THEN 'Partition Function'

          WHEN 18002 THEN 'Replication Filter Procedure'

          WHEN 18004 THEN 'Table-valued SQL Function'

          WHEN 18259 THEN 'Server Role'

          WHEN 18263 THEN 'Microsoft Windows Group'

          WHEN 19265 THEN 'Asymmetric Key'

          WHEN 19277 THEN 'Master Key'

          WHEN 19280 THEN 'Primary Key'

          WHEN 19283 THEN 'ObfusKey'

          WHEN 19521 THEN 'Asymmetric Key Login'

          WHEN 19523 THEN 'Certificate Login'

          WHEN 19538 THEN 'Role'

          WHEN 19539 THEN 'SQL Login'

          WHEN 19543 THEN 'Windows Login'

          WHEN 20034 THEN 'Remote Service Binding'

          WHEN 20036 THEN 'Event Notification on Database'

          WHEN 20037 THEN 'Event Notification'

          WHEN 20038 THEN 'Scalar SQL Function'

          WHEN 20047 THEN 'Event Notification on Object'

          WHEN 20051 THEN 'Synonym'

          WHEN 20549 THEN 'End Point'

          WHEN 20801 THEN 'Adhoc Queries which may be cached'

          WHEN 20816 THEN 'Prepared Queries which may be cached'

          WHEN 20819 THEN 'Service Broker Service Queue'

          WHEN 20821 THEN 'Unique Constraint'

          WHEN 21057 THEN 'Application Role'

          WHEN 21059 THEN 'Certificate'

          WHEN 21075 THEN 'Server'

          WHEN 21076 THEN 'Transact-SQL Trigger'

          WHEN 21313 THEN 'Assembly'

          WHEN 21318 THEN 'CLR Scalar Function'

          WHEN 21321 THEN 'Inline scalar SQL Function'

          WHEN 21328 THEN 'Partition Scheme'

          WHEN 21333 THEN 'User'

          WHEN 21571 THEN 'Service Broker Service Contract'

          WHEN 21572 THEN 'Trigger on Database'

          WHEN 21574 THEN 'CLR Table-valued Function'

          WHEN 21577

          THEN 'Internal Table (For example, XML Node Table, Queue Table.)'

          WHEN 21581 THEN 'Service Broker Message Type'

          WHEN 21586 THEN 'Service Broker Route'

          WHEN 21587 THEN 'Statistics'

          WHEN 21825 THEN 'User'

          WHEN 21827 THEN 'User'

          WHEN 21831 THEN 'User'

          WHEN 21843 THEN 'User'

          WHEN 21847 THEN 'User'

          WHEN 22099 THEN 'Service Broker Service'

          WHEN 22601 THEN 'Index'

          WHEN 22604 THEN 'Certificate Login'

          WHEN 22611 THEN 'XMLSchema'

          WHEN 22868 THEN 'Type'

          ELSE 'Hmmm???'

        END AS ObjectType

FROM    [fn_trace_gettable](CONVERT(VARCHAR(150), ( SELECT TOP 1

                                                            value

                                                    FROM    [fn_trace_getinfo](NULL)

                                                    WHERE   [property] = 2

                                                  )), DEFAULT) T

        JOIN sys.trace_events TE ON T.EventClass = TE.trace_event_id

        JOIN sys.trace_subclass_values v ON v.trace_event_id = TE.trace_event_id

                                            AND v.subclass_value = t.EventSubClass

WHERE   TE.name IN ( 'Object:Created', 'Object:Deleted', 'Object:Altered' )

                -- filter statistics created by SQL server                                         

        AND t.ObjectType NOT IN ( 21587 )

                -- filter tempdb objects

        AND DatabaseID <> 2

                -- get only events in the past 24 hours

        AND StartTime > DATEADD(HH, -24, GETDATE())

ORDER BY t.StartTime DESC ;

Klicken Sie hier zum Vergrößern

Geben Sie hier die Bildbeschreibung ein

Ist das der Job eines DBA? um zu wissen, wer was in der SQL erstellt hat?

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.

Geben Sie hier die Bildbeschreibung ein

Der Vollständigkeit halber möchte ich erwähnen: Welche Ereignisinformationen kann ich standardmäßig von SQL Server erhalten? von Aaron Bertrand.


hallo @kin. Ich habe ein Problem beim "Konvertieren". Aber was ist dort falsch? Es heißt Sintax-Fehler.
Racer SQL

@ RafaelPiccinelli In welcher Zeile wird ein Fehler angezeigt? Ich habe es versucht und bekomme keinen Fehler. Sie müssen auch Änderungen vornehmen, DATEADD(HH, -24, GETDATE())wenn Sie Ergebnisse für mehr als 24 Stunden erhalten möchten.
Kin Shah

Entschuldigung, ich weiß nicht, was los war. Ich kopiere / past einfach wieder und es funktioniert. Wenn ich diese Zeile kommentiere, kann ich dann alle Prozeduren einer bestimmten Datenbank abrufen, beispielsweise mit "AND DatabaseID = 224"?
Racer SQL

@ RafaelPiccinelli Schön, dass es funktioniert. Wenn Sie diese Zeile auskommentieren (was ein Filter ist), erhalten Sie alle Ergebnisse. Spielen Sie einfach mit Filtern herum, um die gewünschten Ergebnisse zu erzielen - filtern Sie nach dbid / dbname oder sogar SP-Namen. Dies gibt Ihnen nicht den Benutzer, der den SP erstellt hat, sondern gibt Ihnen Zeit, als ein SP erstellt wurde -select * from sys.procedures where type = 'P' order by create_date desc
Kin Shah

Danke @Kin Ich benutze es gerade. Ich möchte wirklich nicht nerven, aber warum erhalte ich nur die Ergebnisse einer Datenbank? Ich verwende die hier veröffentlichte Abfrage (die große), sehe aber nur eine Datenbank. Wenn ich benutze AND DatabaseID= 'the_Database_I_Want, zeigt es mir nichts, auch mit DATEADD(HH, -24, GETDATE())kommentierten. Mache ich etwas falsch?
Racer SQL

3

Ich komme zu spät, aber ich "mache" Sicherheits- und Verwaltungssachen.

Ist das der Job eines DBA? um zu wissen, wer was in der SQL erstellt hat?

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 ..."

  1. Es gab nur eine Ausnahme. 2007 oder so bemerkte ich eine Menge Netzwerkaktivitäten in diesem Segment. Ich ließ es einen Tag lang los und untersuchte es dann, da es von einer Maschine kam, die mehr aus dem Büro als aus dem Büro zu sein schien. An dem fraglichen Tag war sie den halben Tag weg, also wurde meine Hand gezwungen . Es stellte sich heraus, dass sie für ihre bevorstehende Hochzeit CDs von Limewire und Bearshare heruntergeladen hatte. Ich übergab es ihrem Chef zur Diskussion. Er beschloss, nichts zu tun, aber ich dachte, er sollte es zumindest wissen, da dies die Organisation in Gefahr brachte, rechtliche Schritte einzuleiten.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.