누가 절차를 만들었습니까? (SQL Server 2008 R2)


10

SQL Server 2008에서 특정 조달 항목을 만든 사람을 나열하는 방법이 있습니까?

이 SO 링크 에는 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

이를 기록 할 기존 트리거가있는 경우 가능합니다. 기본 추적 (명시 적으로 비활성화하지 않은 경우)은 이미 실행 중이며 이벤트가 롤오버되고 정보가 사라지지 않는 한 이벤트를 캡처합니다.
Kin Shah

@RafaelPiccinelli 나는 테이블 SQL 코드를 추가했다
Craig Efrein

@CraigEfrein ... @ kin에게 감사합니다. "default trace enabled = 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에서 기본적으로 어떤 이벤트 정보를 얻을 수 있습니까? Aaron Bertrand에서.


안녕하세요 @kin. "변환"에 문제가 있습니다. 그러나 무엇이 잘못 되었습니까? sintax error라고 표시되어 있습니다.
Racer SQL

@RafaelPiccinelli 어떤 라인에 오류가 있습니까? 나는 그것을 시도하고 오류가 발생하지 않습니다. DATEADD(HH, -24, GETDATE())24 시간 이상 결과를 얻으려면 수정해야합니다 .
Kin Shah

죄송합니다. 무엇이 잘못되었는지 모르겠습니다. 다시 복사 / 붙여 넣기하고 작동합니다. 이 줄을 주석 처리하면 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 내부에서 무엇을 만들 었는지 알고?

. 가능하면이 로그를 보유하거나 작성하는 것이 중요합니다. 그러나,이 관점이 중요해질 때까지 "이 상자를 열지"않는 것이 본인의 책임입니다. 다시 말해서, 다시 말하면, 데이터에 대한 저장소를 제공하고, 안전한지 확인하고, 조정되었는지 확인한 다음, 특별히 부름을받지 않으면 내부 데이터에서 멀리 떨어져 있어야합니다. 그것을 보거나 목표를 달성하기 위해 필요하지 않은 한 그것을보십시오.

저의 견해와 견해는 있지만 수년간 민감한 기밀 데이터를 다루어 왔으며 사용자와의 신뢰를 떨어 뜨리기 때문에 거의 "1 상자를 열지"않았습니다.

이제 다른 길을 봅시다 : 아무도 절차가 가장자리에 어떻게 반응하는지 빨리 알아낼 수 없다면 어떻게해야합니까? 퍼즐을 풀기 위해 당신이나 내가 한 시간이 걸리는 것은 저자에게 몇 분이 걸릴 수 있습니다. "아, 맞습니다.

  1. 단 하나의 예외가있었습니다. 2007 년쯤에 나는 그 세그먼트에서 수많은 네트워크 활동을 발견했다. 하루 종일 집을 비운 다음 조사를 받았는데, 그 때보 다 사무실에없는 것처럼 보이는 사람의 기계에서 나온 것이 었습니다. 문제의 날에 그녀는 하루 반 동안 갔고, 그래서 제 손은 강요당했습니다 . 다가오는 결혼식을 위해 Limewire와 Bearshare에서 CD를 다운로드 한 것으로 나타났습니다. 토론을 위해 상사에게 넘겼습니다. 그는 아무것도하지 않기로 결정했지만, 조직이 법적 조치의 위험에 처하게되므로 최소한 알아야한다고 생각했습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.