Siapa yang membuat prosedur? (SQL Server 2008 R2)

10

Apakah ada cara untuk mendaftar siapa yang membuat pengadaan tertentu di SQL Server 2008?

Di tautan SO ini ada beberapa jawaban tetapi dari 6 tahun yang lalu.

Saya tahu ini adalah praktik terbaik untuk menuliskan nama dan tanggal Anda, dan kemudian mulai membuat prosedur, tetapi saya tidak melihat ini di tempat saya bekerja.

Jika tidak ada cara untuk melakukan ini, dapatkah tugas ini dilakukan dengan pemicu?

Dan pertanyaan bonus. Apakah ini pekerjaan, dari dba? untuk mengetahui siapa yang membuatnya?

Terima kasih banyak.

SQL pembalap
sumber

Jawaban:

7

Ya ada caranya

Tabel untuk menyimpan hasil pemicu

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

Pemicunya

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

Permintaan untuk Mengaudit hasil pemicu

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 lain mungkin memiliki pendapat yang berbeda, tetapi saya menganggap memiliki informasi ini tersedia sebagai penting untuk DBA.

Craig Efrein
sumber
Halo. Terima kasih atas jawaban cepatnya. Saya akan membuat tes kecil di sini.
Pembalap SQL
@craig ... Saya mengalami masalah di sini FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Haruskah saya membuat tabel?
Pembalap SQL
Ini dimungkinkan jika ada pemicu yang ada yang akan merekamnya. Jejak default (kecuali jika Anda telah secara eksplisit menonaktifkannya) sudah berjalan dan menangkap peristiwa (kecuali jika itu terguling dan info hilang).
Kin Shah
@RafaelPiccinelli Saya menambahkan tabel kode SQL
Craig Efrein
Terima kasih @CraigEfrein ... @ kin, saya memiliki "jejak bawaan diaktifkan = 1". Saya tidak mengerti komentar Anda. Pemicu ini hanya akan berfungsi jika saya sudah memiliki pemicu lain? Maaf saya baru di dunia keamanan.
Pembalap SQL
3

Jika Anda memiliki jejak default diaktifkan dan itu belum terguling, maka Anda dapat menggunakannya untuk menemukan siapa yang membuat 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 ;

Klik di sini untuk memperbesar

masukkan deskripsi gambar di sini

Apakah ini pekerjaan, dari dba? untuk mengetahui siapa yang menciptakan apa yang ada di dalam sql?

Itu tergantung pada mengapa Anda ingin tahu apakah objek dibuat / diubah atau dijatuhkan. Anda dapat menggunakan notifikasi acara untuk mencatat dan memberi tahu Anda jika Anda merasa bahwa objek dibuat / dijatuhkan atau diubah oleh pengguna yang tidak sah. Pastikan Anda memiliki filter yang tepat di tempat.

masukkan deskripsi gambar di sini

Untuk kelengkapan jawaban ini, saya ingin menyebutkan - Informasi acara apa yang bisa saya dapatkan secara default dari SQL Server? dari Aaron Bertrand.

Kin Shah
sumber
halo @ ya. Saya mengalami masalah dalam "konversi". Tapi apa yang salah di sana? Dikatakan kesalahan sintax.
Pembalap SQL
@ RafaelPiccinelli baris apa yang Anda dapatkan kesalahan? Saya mencobanya dan tidak mendapatkan kesalahan. Anda juga perlu memodifikasi DATEADD(HH, -24, GETDATE())jika ingin mendapatkan hasil lebih dari 24 jam.
Kin Shah
maaf, saya tidak tahu apa yang salah. Saya hanya menyalin / melewati lagi dan ini berfungsi. Jika saya mengomentari baris ini, bisakah saya mendapatkan semua prosedur dari basis data tertentu, menggunakan `AND DatabaseID = 224` misalnya?
Pembalap SQL
@RafaelPiccinelli Senang itu bekerja. Jika Anda mengomentari baris itu (yang merupakan filter) maka Anda akan mendapatkan semua hasil. Hanya bermain-main dengan filter untuk mendapatkan hasil yang Anda inginkan - filter berdasarkan dbid / dbname atau bahkan nama SP. Ini tidak akan memberi Anda pengguna yang menciptakan SP, tetapi akan memberi Anda waktu ketika SP dibuat -select * from sys.procedures where type = 'P' order by create_date desc
Kin Shah
Terima kasih @Kin, saya menggunakannya sekarang. Saya benar-benar tidak ingin mengganggu, tetapi mengapa saya hanya mendapatkan hasil dari 1 database? Saya menggunakan query yang diposting di sini (yang besar) tetapi saya hanya melihat satu database. Jika saya menggunakan AND DatabaseID= 'the_Database_I_Want, itu tidak menunjukkan apa-apa kepada saya, bahkan dengan DATEADD(HH, -24, GETDATE())berkomentar. Apakah saya melakukan sesuatu yang salah?
Pembalap SQL
3

Saya datang terlambat, tetapi saya "melakukan" keamanan dan administrasi.

Apakah ini pekerjaan, dari dba? untuk mengetahui siapa yang menciptakan apa yang ada di dalam sql?

Ya . Penting untuk memiliki atau membuat log ini sedapat mungkin. Namun, menurut saya, juga merupakan tanggung jawab Anda untuk tidak "membuka kotak ini" sampai menjadi penting. Dengan kata lain - sekali lagi, dalam pandangan saya - itu adalah tugas Anda untuk menyediakan repo untuk data, pastikan itu aman, pastikan itu disetel ... dan kemudian menjauh dari data di dalam kecuali Anda dipanggil untuk secara khusus lihat itu atau kecuali itu diperlukan untuk mencapai tujuan Anda.

Pendapat saya, dan pandangan saya, tetapi saya telah berurusan dengan data sensitif & rahasia selama bertahun-tahun dan telah membuat hampir tidak pernah [1] "membuka kotak," karena hal ini menurunkan kepercayaan pengguna.

Sekarang izinkan saya mengambil jalan yang berbeda : bagaimana jika tidak ada yang dapat dengan cepat mengetahui bagaimana prosedur menanggapi kasus-kasus tepi? Apa yang bisa membuat Anda atau saya satu jam untuk menyelesaikan mungkin memerlukan beberapa menit penulis: "ah, benar, hal ini gagal ketika ..."

  1. Ada satu dan hanya satu pengecualian. Pada tahun 2007, saya melihat banyak aktivitas jaringan di segmen ini. Aku membiarkannya pergi selama satu hari dan kemudian menyelidiki, karena itu datang dari mesin seseorang yang tampaknya lebih dari kantor daripada masuk. Pada hari yang bersangkutan, dia pergi selama setengah hari, jadi tanganku dipaksa . Ternyata dia mengunduh CD dari Limewire dan Bearshare untuk pernikahannya yang akan datang. Saya menyerahkannya kepada bosnya untuk diskusi. Dia memutuskan untuk tidak melakukan apa-apa, tetapi saya pikir dia setidaknya harus tahu, karena hal itu membuat organisasi beresiko tindakan hukum.
Chris
sumber