Хто створив процедуру? (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

Інша DBA може мати іншу думку, але я вважаю, що ця інформація легко доступна як важлива для DBA.


Привіт. Дякую за швидку відповідь. Я зроблю тут невеликий тест.
Racer SQL

@craig ... У мене тут проблеми FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Чи слід створити таблицю?
Racer SQL

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

@RafaelPiccinelli Я додав таблицю SQL-код
Craig Efrein

Дякуємо @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? від Аарона Бертран.


привіт @kin. У мене проблеми з "конвертувати". Але що там не так? Він говорить про помилку sintax.
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 Shah

Дякую @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.