Kto stworzył procedurę? (SQL Server 2008 R2)

10

Czy istnieje sposób wylistowania, kto utworzył określone zamówienie w SQL Server 2008?

W tym linku SO jest kilka odpowiedzi, ale sprzed 6 lat.

Wiem, że najlepiej jest wpisać swoje imię i datę, a następnie rozpocząć tworzenie procedury, ale nie widzę tego w miejscu, w którym pracuję.

Jeśli nie da się tego zrobić, czy można wykonać to zadanie za pomocą wyzwalaczy?

I dodatkowe pytanie. Czy to jest praca dba? wiedzieć, kto go stworzył?

Dziękuję Ci bardzo.

Racer SQL
źródło

Odpowiedzi:

7

Tak, jest sposób

Tabela do przechowywania wyników wyzwalacza

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

Spust

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

Kwerenda do kontroli wyników wyzwalacza

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

Inny DBA może mieć inne zdanie, ale uważam, że dostępność tych informacji jest tak ważna dla DBA.

Craig Efrein
źródło
Witaj. Dziękuję za szybką odpowiedź. Zrobię tutaj mały test.
Racer SQL,
@craig ... Mam tutaj problemy FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Czy powinienem stworzyć stół?
Racer SQL,
Jest to możliwe, jeśli istnieje wyzwalacz, który go zarejestruje. Domyślny ślad (o ile go wyraźnie nie wyłączono) jest już uruchomiony i przechwytuje zdarzenia (chyba że zostanie on przeniesiony, a informacje znikną).
Kin Shah,
@RafaelPiccinelli Dodałem kod SQL tabeli
Craig Efrein
Dzięki @CraigEfrein ... @ kin, mam „domyślny ślad włączony = 1”. Nie zrozumiałem twojego komentarza. Ten wyzwalacz zadziała tylko wtedy, gdy mam już inny wyzwalacz? Przepraszam, jestem nowy w świecie bezpieczeństwa.
Racer SQL
3

Jeśli masz włączone śledzenie domyślne i nie zostało ono przeniesione, możesz użyć go do ustalenia, kto utworzył dodatek SP

/*
    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 ;

Kliknij tutaj, aby powiększyć

wprowadź opis zdjęcia tutaj

Czy to jest praca dba? wiedzieć, kto stworzył co w sql?

To zależy od tego, dlaczego chcesz wiedzieć, czy obiekty są tworzone, zmieniane czy upuszczane. Możesz użyć powiadomienia o zdarzeniu do zarejestrowania się i powiadomienia, jeśli uważasz, że obiekty zostały utworzone / upuszczone lub zmienione przez nieautoryzowanego użytkownika. Upewnij się, że masz odpowiednie filtry w miejscu.

wprowadź opis zdjęcia tutaj

Aby uzyskać kompletność tej odpowiedzi, chcę wspomnieć - Jakie informacje o zdarzeniu mogę domyślnie uzyskać z programu SQL Server? od Aarona Bertranda.

Kin Shah
źródło
cześć @kin. Mam problem z „konwersją”. Ale co tam jest nie tak? Mówi błąd sintax.
Racer SQL,
@RafaelPiccinelli w jakiej linii pojawia się błąd? Próbowałem i nie otrzymuję żadnego błędu. Musisz także zmodyfikować, DATEADD(HH, -24, GETDATE())jeśli chcesz otrzymywać wyniki przez ponad 24 godziny.
Kin Shah,
przepraszam, nie wiem co było nie tak. Po prostu kopiuję / ponownie i działam. Jeśli skomentuję ten wiersz, czy mogę uzyskać wszystkie procedury określonej bazy danych, używając na przykład `AND DatabaseID = 224`?
Racer SQL
@RafaelPiccinelli Cieszę się, że działa. Jeśli skomentujesz ten wiersz (który jest filtrem), otrzymasz wszystkie wyniki. Po prostu baw się z filtrami, aby uzyskać pożądane wyniki - filtruj według dbid / dbname, a nawet nazwy SP. Nie da to użytkownikowi, który utworzył SP, ale da ci czas, gdy SP został stworzony -select * from sys.procedures where type = 'P' order by create_date desc
Kin Shah,
Dzięki @Kin Używam go teraz. Naprawdę nie chcę być denerwujący, ale dlaczego otrzymuję tylko wyniki z 1 bazy danych? Korzystam z zamieszczonego tutaj zapytania (dużego), ale widzę tylko jedną bazę danych. Jeśli użyję AND DatabaseID= 'the_Database_I_Want, nic mi nie pokazuje, nawet z DATEADD(HH, -24, GETDATE())komentarzem. czy robię coś źle?
Racer SQL
3

Przychodzę późno, ale „robię” sprawy związane z bezpieczeństwem i administracją.

Czy to jest praca dba? wiedzieć, kto stworzył co w sql?

TAK . Ważne jest, aby mieć lub tworzyć te dzienniki tam, gdzie to możliwe. Moim zdaniem jednak Twoim obowiązkiem jest nie „otwierać tego pudełka”, dopóki nie stanie się ważne. Innymi słowy - znowu, moim zdaniem - Twoim zadaniem jest zapewnienie repozytorium danych, upewnienie się, że jest bezpieczne, upewnienie się, że jest dostrojone ... a następnie trzymanie się z dala od danych w środku, chyba że zostaniesz specjalnie wezwany spójrz na to lub chyba, że ​​jest to wymagane do osiągnięcia celu.

Moja opinia i mój pogląd, ale od wielu lat zajmowałem się wrażliwymi i poufnymi danymi i sprawiłem, że bardzo prawie nigdy [1] „nie otwieram skrzynki”, ponieważ to obniża zaufanie użytkowników.

Teraz pozwól mi pójść inną ścieżką : co jeśli nikt nie będzie w stanie szybko dowiedzieć się, jak procedura reaguje na przypadki skrajne? Zastanowienie się nad tym, co może zająć Ci godzinę lub godzinę, może zająć autorowi kilka minut: „Ach, racja, to się nie udaje, kiedy ...”

  1. Był tylko jeden wyjątek. Mniej więcej w 2007 roku zauważyłem mnóstwo aktywności sieci w tym segmencie. Pozwoliłem mu odejść na jeden dzień, a potem zbadałem, ponieważ pochodziło od maszyny osoby, która wydawała się być poza biurem bardziej niż w środku. W tym dniu nie było jej przez pół dnia, więc moja ręka była zmuszona . Okazuje się, że pobierała płyty CD z Limewire i Bearshare na nadchodzący ślub. Oddałem to jej szefowi do dyskusji. Postanowił nic nie robić, ale pomyślałem, że powinien przynajmniej wiedzieć, ponieważ naraża to organizację na ryzyko prawne.
Chris
źródło