Кто создал процедуру? (SQL Server 2008 R2)


10

Есть ли способ перечислить, кто создал определенную заготовку в SQL Server 2008?

В этой ссылке есть некоторые ответы, но 6 лет назад.

Я знаю, что лучше всего написать ваше имя и дату, а затем начать создавать процедуру, но я не вижу этого там, где я работаю.

Если нет способа сделать это, можно ли выполнить эту задачу с помощью триггеров?

И бонусный вопрос. Это работа DBA? знать, кто это создал?

Большое спасибо.

Ответы:


7

Да есть способ

Таблица для хранения результатов триггера

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

Триггер

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

Запрос на аудит результатов триггера

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

У другого администратора базы данных может быть другое мнение, но я считаю, что доступность этой информации важна для администратора.


Привет. Спасибо за быстрый ответ. Я сделаю небольшой тест здесь.
Racer SQL

@craig ... У меня проблемы здесь FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Должен ли я создать таблицу?
Racer SQL

Это возможно, если существует существующий триггер, который будет записывать его. Трассировка по умолчанию (если вы ее явно не отключили) уже запущена и фиксирует события (если она не пролонгирована и информация не исчезла).
Кин Шах

@RafaelPiccinelli Я добавил в таблицу SQL-код
Крейг Эфрейн,

Спасибо @CraigEfrein ... @ kin, у меня "трассировка по умолчанию включена = 1". Я не понял ваш комментарий. Этот триггер будет работать, только если у меня уже есть другой триггер? Извините, я новичок в мире безопасности.
Racer SQL

3

Если у вас включена трассировка по умолчанию и она не пролонгирована, вы можете использовать ее, чтобы узнать, кто создал 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 ;

Нажмите здесь, чтобы увеличить

введите описание изображения здесь

Это работа DBA? знать, кто что создал внутри sql?

Это зависит от того, почему вы хотите знать, были ли объекты созданы / изменены или удалены. Вы можете использовать уведомление о событии, чтобы регистрировать и уведомлять вас, если вы чувствуете, что объекты созданы / удалены или изменены неавторизованным пользователем. Убедитесь, что у вас есть надлежащие фильтры на месте.

введите описание изображения здесь

Для полноты этого ответа я хочу упомянуть - Какую информацию о событиях я могу получить по умолчанию из SQL Server? от Аарона Бертран.


привет @кин У меня проблема в "конвертации". Но что там не так? Это говорит об ошибке синтаксиса.
Racer SQL

@RafaelPiccinelli в какой строке вы получаете сообщение об ошибке? Я попробовал это и не получаю никакой ошибки. Вам также нужно изменить, DATEADD(HH, -24, GETDATE())если вы хотите получать результаты более 24 часов.
Кин Шах

извини, я не знаю, что было не так. Я просто копирую / прошёл снова и это работает. Если я прокомментирую эту строку, могу ли я получить все процедуры определенной базы данных, используя, например, `AND DatabaseID = 224`?
Racer SQL

@RafaelPiccinelli Рад, что это работает. Если вы закомментируете эту строку (которая является фильтром), вы получите все результаты. Просто поиграйтесь с фильтрами, чтобы получить желаемые результаты - фильтр по имени dbid / dbname или даже имени SP. Это не даст вам пользователя, который создал SP, но даст вам время, когда SP был создан -select * from sys.procedures where type = 'P' order by create_date desc
Кин Шах

Спасибо @Kin, я использую это прямо сейчас. Я действительно не хочу быть раздражающим, но почему я получаю только результаты 1 базы данных? Я использую запрос, размещенный здесь (большой), но я вижу только одну базу данных. Если я использую AND DatabaseID= 'the_Database_I_Want, он ничего не показывает, даже с DATEADD(HH, -24, GETDATE())комментариями. Я делаю что-то неправильно?
Racer SQL

3

Я прихожу поздно, но я "делаю" вопросы безопасности и администрирования.

Это работа DBA? знать, кто что создал внутри sql?

YES . Важно иметь или создавать эти журналы, где это возможно. Однако, на мой взгляд, вы также не должны «открывать эту коробку», пока она не станет важной. Другими словами, опять же, на мой взгляд, ваша задача - обеспечить репо для данных, убедиться в их безопасности, убедиться, что они настроены ... и затем держаться подальше от данных внутри, если вы не призваны специально посмотрите на это или если это не требуется для достижения вашей цели.

Мое мнение и мое мнение, но я уже много лет имею дело с конфиденциальными и конфиденциальными данными и почти никогда не высказывался [1] «открыто», поскольку это снижает доверие к пользователям.

Теперь позвольте мне пойти другим путем : что, если никто не сможет быстро выяснить, как процедура реагирует на крайние случаи? То, что может занять у вас или у меня час, чтобы разобраться, может занять у автора несколько минут: «Ах, да, эта штука не работает, когда ...»

  1. Было одно и только одно исключение. В 2007 году я заметил тонну сетевой активности в этом сегменте. Я отпустил его на один день, а затем провел расследование, поскольку оно исходило от машины человека, который, казалось, находился вне офиса больше, чем в. В рассматриваемый день она отсутствовала в течение половины дня, поэтому моя рука была вынуждена , Оказывается, она скачивала компакт-диски с Limewire и Bearshare для своей предстоящей свадьбы. Я передал это ее боссу для обсуждения. Он решил ничего не делать, но я подумал, что он должен хотя бы знать, так как это подвергает организацию риску судебных исков.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.