Ai tạo ra một thủ tục? (Máy chủ SQL 2008 R2)


10

Có cách nào để liệt kê những người đã tạo ra một số mua sắm trong SQL Server 2008 không?

Trong liên kết SO này có một số câu trả lời nhưng từ 6 năm trước.

Tôi biết đó là một cách tốt nhất để viết tên và ngày của bạn, và sau đó bắt đầu tạo thủ tục, nhưng tôi không thấy đây là nơi tôi làm việc.

Nếu không có cách nào để làm điều này, nhiệm vụ này có thể được thực hiện với các kích hoạt không?

Và một câu hỏi tiền thưởng. Đây có phải là công việc của một dba? để biết ai đã tạo ra nó?

Cảm ơn rât nhiều.

Câu trả lời:


7

Vâng, đó là một cách

Bảng để lưu trữ kết quả của kích hoạt

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

Kích hoạt

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

Truy vấn để kiểm tra kết quả của trình kích hoạt

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

Một DBA khác có thể có ý kiến ​​khác, nhưng tôi cho rằng việc có sẵn thông tin này là quan trọng đối với một DBA.


Xin chào. Cảm ơn bạn đã trả lời nhanh chóng. Tôi sẽ làm một bài kiểm tra nhỏ ở đây.
Racer SQL

@craig ... Tôi đang gặp vấn đề ở đây FROM [SOME_DATABASE].[dbo].[ddl_objects_log]... Tôi có nên tạo bảng không?
Racer SQL

Điều này là có thể nếu có một kích hoạt hiện tại sẽ ghi lại nó. Theo dõi mặc định (trừ khi bạn đã vô hiệu hóa nó một cách rõ ràng) đang chạy và ghi lại các sự kiện (trừ khi nó được cuộn lại và thông tin không còn nữa).
Kin Shah

@RafaelPiccinelli Tôi đã thêm mã SQL bảng
Craig Efrein

Cảm ơn @CraigEfrein ... @ kin, tôi có "theo dõi mặc định được bật = 1". Tôi không hiểu bình luận của bạn. Kích hoạt này sẽ chỉ hoạt động nếu tôi đã có một kích hoạt khác? Xin lỗi tôi là một người mới trong thế giới bảo mật.
Racer SQL

3

Nếu bạn đã bật theo dõi mặc định và nó chưa được cuộn, thì bạn có thể sử dụng nó để tìm ai đã tạo 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 ;

Nhấn vào đây để phóng to

nhập mô tả hình ảnh ở đây

Đây có phải là công việc của một dba? để biết ai đã tạo ra những gì bên trong sql?

Nó phụ thuộc vào lý do tại sao bạn muốn biết nếu các đối tượng được tạo / thay đổi hoặc loại bỏ. Bạn có thể sử dụng thông báo sự kiện để đăng nhập và thông báo cho bạn nếu bạn cảm thấy rằng các đối tượng được tạo / bỏ hoặc thay đổi bởi người dùng trái phép. Hãy chắc chắn rằng bạn có bộ lọc thích hợp tại chỗ.

nhập mô tả hình ảnh ở đây

Để hoàn thiện câu trả lời này, tôi muốn đề cập - Tôi có thể nhận thông tin sự kiện nào theo mặc định từ SQL Server? từ Aaron Bertrand.


xin chào @kin. Tôi đang gặp vấn đề trong việc "chuyển đổi". Nhưng có gì sai ở đó? Nó nói lỗi sintax.
Racer SQL

@RafaelPiccinelli bạn đang gặp lỗi gì? Tôi đã thử nó và không nhận được bất kỳ lỗi. Bạn cũng cần sửa đổi DATEADD(HH, -24, GETDATE())nếu bạn muốn nhận được kết quả trong hơn 24 giờ.
Kin Shah

xin lỗi, tôi không biết có chuyện gì Tôi chỉ sao chép / quá khứ một lần nữa và nó hoạt động. Nếu tôi nhận xét dòng này, tôi có thể nhận được tất cả các quy trình của một cơ sở dữ liệu nhất định không, bằng cách sử dụng `AND DatabaseID = 224` chẳng hạn?
Racer SQL

@RafaelPiccinelli Vui mừng vì nó đang hoạt động. Nếu bạn nhận xét dòng đó (là bộ lọc) thì bạn sẽ nhận được tất cả kết quả. Chỉ cần chơi xung quanh với các bộ lọc để có kết quả mong muốn - lọc theo dbid / dbname hoặc thậm chí tên SP. Điều này sẽ không cung cấp cho bạn người dùng đã tạo SP, nhưng sẽ cho bạn thời gian khi SP được tạo -select * from sys.procedures where type = 'P' order by create_date desc
Kin Shah

Cảm ơn @Kin tôi đang sử dụng nó ngay bây giờ. Tôi thực sự không muốn làm phiền, nhưng tại sao tôi chỉ nhận được kết quả của 1 cơ sở dữ liệu? Tôi đang sử dụng truy vấn được đăng ở đây (cái lớn) nhưng tôi chỉ thấy một cơ sở dữ liệu. Nếu tôi sử dụng AND DatabaseID= 'the_Database_I_Want, nó cho tôi thấy không có gì, ngay cả với DATEADD(HH, -24, GETDATE())nhận xét. Tôi có làm điều gì sai?
Racer SQL

3

Tôi đến muộn, nhưng tôi "làm" bảo mật và * quản trị mọi thứ.

Đây có phải là công việc của một dba? để biết ai đã tạo ra những gì bên trong sql?

. Điều quan trọng là phải có hoặc tạo các bản ghi này bất cứ khi nào có thể. Tuy nhiên, theo quan điểm của tôi, trách nhiệm của bạn là không "mở hộp này" cho đến khi nó trở nên quan trọng. Nói cách khác - một lần nữa, theo quan điểm của tôi - công việc của bạn là cung cấp repo cho dữ liệu, đảm bảo an toàn, đảm bảo rằng nó được điều chỉnh ... và sau đó tránh xa dữ liệu bên trong trừ khi bạn được gọi cụ thể nhìn vào nó hoặc trừ khi nó được yêu cầu để hoàn thành mục tiêu của bạn.

Ý kiến ​​của tôi và quan điểm của tôi, nhưng tôi đã xử lý dữ liệu nhạy cảm và bí mật trong nhiều năm và đã khiến nó trở thành một điểm gần như không bao giờ [1] "mở hộp", vì điều này làm giảm niềm tin với người dùng.

Bây giờ hãy để tôi đi một con đường khác : nếu không ai có thể nhanh chóng tìm ra cách thủ tục phản ứng với các trường hợp cạnh? Điều gì có thể khiến bạn hoặc tôi mất một giờ để giải đố có thể khiến tác giả mất vài phút: "ah, đúng rồi, điều này thất bại khi ..."

  1. Có một và chỉ một ngoại lệ. Trong năm 2007 hoặc lâu hơn, tôi nhận thấy rất nhiều hoạt động mạng trên phân khúc. Tôi để nó đi trong một ngày và sau đó điều tra, vì nó đến từ một cỗ máy của một người dường như rời khỏi văn phòng nhiều hơn. Vào ngày hôm đó, cô ấy đã đi được nửa ngày, vì vậy tay tôi bị ép buộc . Hóa ra cô ấy đang tải CD từ Limewire và Bearshare cho đám cưới sắp tới của mình. Tôi chuyển nó cho sếp của cô ấy để thảo luận. Anh ta quyết định không làm gì, nhưng tôi nghĩ ít nhất anh ta cũng nên biết, vì điều đó khiến tổ chức có nguy cơ phải hành động pháp lý.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.