Kim bir prosedür yarattı? (SQL Server 2008 R2)


10

SQL Server 2008'de belirli tedarikleri kimin yarattığını listelemenin bir yolu var mı?

Gelen bu SO bağlantısını bazı cevaplar vardır ama 6 yıl dan önce.

Adınızı ve tarihinizi yazmanın en iyi yol olduğunu biliyorum ve sonra prosedürü oluşturmaya başlıyorum, ancak çalıştığım yerde görmüyorum.

Bunu yapmanın bir yolu yoksa, bu görev tetikleyicilerle yapılabilir mi?

Ve bonus bir soru. Bu bir dba'nın işi mi? kimin yarattığını bilmek için?

Çok teşekkür ederim.

Yanıtlar:


7

Evet bir yolu var

Tetikleyicinin sonuçlarını depolayan tablo

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

Tetik

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

Tetikleyicinin sonuçlarını Denetleme Sorgusu

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

Başka bir DBA farklı bir görüşe sahip olabilir, ancak bu bilgilerin bir DBA için hazır bulunmasının önemli olduğunu düşünüyorum.


Merhaba. Hızlı cevap için teşekkürler. Burada küçük bir test yapacağım.
Racer SQL

@craig ... Burada sorun yaşıyorum FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Tabloyu oluşturmalı mıyım?
Racer SQL

Bu, onu kaydedecek mevcut bir tetikleyici varsa mümkündür. Varsayılan izleme (açıkça devre dışı bırakmadıysanız) zaten çalışıyor ve olayları yakalar (döndürülmediği ve bilgi gitmediği sürece).
Kin Shah

@RafaelPiccinelli SQL kod tablosunu ekledim
Craig Efrein

Teşekkürler @CraigEfrein ... @ kin, "varsayılan izleme etkin = 1" var. Yorumunu anlamadım. Bu tetikleyici yalnızca başka bir tetikleyicim varsa çalışır mı? Üzgünüm, güvenlik dünyasında yeniyim.
Racer SQL

3

Eğer varsa varsayılan iz etkin ve ardından SP kimin oluşturduğu bulmak için kullanabilirsiniz, takla henüz

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

Büyütmek için tıklayınız

resim açıklamasını buraya girin

Bu bir dba'nın işi mi? sql içinde kim yarattı bilmek için?

Nesnelerin neden yaratıldığını / değiştirildiğini veya düşürüldüğünü bilmek istediğinize bağlıdır. Nesnelerin yetkisiz bir kullanıcı tarafından oluşturulduğunu / bırakıldığını veya değiştirildiğini düşünüyorsanız, olay bildirimini günlüğe kaydetmek ve size bildirmek için kullanabilirsiniz . Yerinde uygun filtrelerin bulunduğundan emin olun.

resim açıklamasını buraya girin

Bu cevabın eksiksiz olması için , SQL Server'dan varsayılan olarak hangi olay bilgilerini alabilirim? Aaron Bertrand'dan.


merhaba @kin. "Convert" sorun yaşıyorum. Ama orada sorun nedir? Sintax hatası diyor.
Racer SQL

@RafaelPiccinelli hangi satırda hata alıyorsunuz? Denedim ve herhangi bir hata almadım. DATEADD(HH, -24, GETDATE())24 saatten daha uzun süre sonuç almak istiyorsanız da değiştirmeniz gerekir .
Kin Shah

üzgünüm, neyin yanlış olduğunu bilmiyorum. Ben sadece kopya / geçmiş tekrar ve onun çalışma. Bu satıra yorum yaparsam, örneğin "AND DatabaseID = 224" komutunu kullanarak belirli bir veritabanının tüm yordamlarını alabilir miyim?
Racer SQL

@RafaelPiccinelli Çalıştığına sevindim. Bu satırı (bir filtre olan) yorumlarsanız, tüm sonuçları alırsınız. İstediğiniz sonuçları elde etmek için filtrelerle oynayın - dbid / dbname veya hatta SP adına göre filtreleyin. Bu size SP'yi oluşturan kullanıcıyı vermeyecektir, ancak bir SP oluşturulduğunda size zaman verecektir -select * from sys.procedures where type = 'P' order by create_date desc
Kin Shah

Teşekkürler @Kin Şu anda kullanıyorum. Gerçekten can sıkıcı olmak istemiyorum, ama neden sadece 1 veritabanının sonuçlarını alıyorum? Burada (büyük olan) gönderilen sorguyu kullanıyorum ama sadece bir veritabanı görüyorum. Eğer kullanırsam AND DatabaseID= 'the_Database_I_Want, DATEADD(HH, -24, GETDATE())yorumda bile bana hiçbir şey göstermez . Yanlış bir şey mi yapıyorum?
Racer SQL

3

Geç geliyorum, ama güvenlik ve yönetim işleri "yaparım".

Bu bir dba'nın işi mi? sql içinde kim yarattı bilmek için?

EVET . Bu günlükleri olabildiğince oluşturmak veya oluşturmak önemlidir. Ancak, bence, önemli olana kadar bu kutuyu açmamak da sizin sorumluluğunuzdadır. Başka bir deyişle - yine, benim görüşüme göre - veri için repo sağlamak, güvenli olduğundan emin olun, ayarlandığından emin olun ... ve daha sonra özel olarak çağrılmadıkça içerideki verilerden uzak durun. ona veya hedefinize ulaşmanız gerekmedikçe bakın.

Benim düşüncem ve benim görüşüm, ama uzun yıllardır hassas ve gizli verilerle uğraştım ve bunu neredeyse hiç [1] “kutuyu aç” noktasına getirdim.

Şimdi farklı bir yol izleyeyim : Ya hiç kimse prosedürün uç durumlara nasıl tepki verdiğini çabucak çözemezse? Sizi ya da ben bir saat bulmaca için ne alabilir yazar birkaç dakika sürebilir: "ah, doğru, bu şey başarısız olduğunda ..."

  1. Sadece tek bir istisna vardı. 2007 yılında, segmentte bir ton ağ etkinliği fark ettim. Bir günlüğüne gitmesine izin verdim ve sonra araştırdım, çünkü ofisten daha fazla dışarıdaymış gibi görünen bir kişinin makinesinden geliyordu. . Yaklaşan düğünü için Limewire ve Bearshare'den CD indirdiği ortaya çıktı. Tartışma için patronuna teslim ettim. Hiçbir şey yapmamaya karar verdi, ama en azından bilmesi gerektiğini düşündüm, çünkü örgütü yasal işlem riski altına soktu.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.