誰が手順を作成しましたか?(SQL Server 2008 R2)


10

SQL Server 2008で特定の調達を作成したユーザーを一覧表示する方法はありますか?

ではこのSOのリンクがいくつかの答えですが、6yrsから前に。

名前と日付を書いてから手順の作成を始めるのが最善の策であることはわかっていますが、私が作業しているところはわかりません。

これを行う方法がない場合、このタスクはトリガーで実行できますか?

そしておまけの質問。これは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にとって重要であると考えています。


こんにちは。素早い回答ありがとうございます。ここで少しテストをします。
レーサーSQL

@craig ...ここで問題がありますFROM [SOME_DATABASE].[dbo].[ddl_objects_log]...テーブルを作成する必要がありますか?
レーサーSQL

これを記録する既存のトリガーがある場合、これは可能です。デフォルトのトレース(明示的に無効にしない限り)は既に実行されており、イベントがキャプチャされます(ロールオーバーされて情報が失われた場合を除く)。
Kin Shah

@RafaelPiccinelliテーブルSQLコードを追加しました
Craig Efrein

@CraigEfrein ... @ kinに感謝します。「デフォルトのトレースが有効= 1」です。コメントを理解できませんでした。このトリガーは、すでに別のトリガーがある場合にのみ機能しますか?申し訳ありませんが、セキュリティの世界では初めてです。
レーサー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。「変換」に問題がありますが、何が問題になっていますか?シンタックスエラーと書いてあります。
レーサーSQL

@RafaelPiccinelliどの行でエラーが発生していますか?試してみましたがエラーは出ません。DATEADD(HH, -24, GETDATE())24時間を超えて結果を取得する場合も、変更する必要があります。
Kin Shah

申し訳ありませんが、何が悪いのかわかりません。私はもう一度コピー/貼り付けして、それを機能させます。この行をコメントすると、たとえば「AND DatabaseID = 224」を使用して、特定のデータベースのすべてのプロシージャを取得できますか?
レーサーSQL

@RafaelPiccinelliうまくいってうれしい。その行(フィルター)をコメント化すると、すべての結果が得られます。フィルターをいじって、希望する結果を取得してください-dbid / dbnameまたはSP名でフィルターします。SPが作成されたとき、これはあなたのSPを作成したユーザーを与える文句を言わない、しかし、あなたの時間を与えるだろう -select * from sys.procedures where type = 'P' order by create_date desc
キン・シャー

ありがとう@Kin今使っています。迷惑になりたくないのですが、なぜ1つのデータベースの結果しか得られないのですか?ここに掲載されているクエリ(大きなもの)を使用していますが、データベースが1つしかありません。を使用するとAND DatabaseID= 'the_Database_I_WantDATEADD(HH, -24, GETDATE())コメントを付けても何も表示されません。私は何か間違ったことをしていますか?
レーサーSQL

3

私は遅れて来ていますが、私はセキュリティと*管理のことを「行います」。

これはdbaの仕事ですか?SQL内で誰が何を作成したかを知るには?

はい。可能な限り、これらのログを保持または作成することが重要です。ただし、重要になるまで「このボックスを開かない」ことは、私の見解ではあなたの責任でもあります。言い換えれば、もう一度、私の見解では、データのリポジトリを提供し、それが安全であることを確認し、それが調整されていることを確認し、そして特に呼び出されない限り、内部のデータに近づかないようにすることです。それを見るか、それがあなたの目標を達成するために必要でない限り。

私の意見と私の見解ですが、私は長年機密性の高い機密データを扱い、ユーザーとの信頼を低下させるため、「箱を開ける」ことはほとんどありません[1]。

今、私は別のパスを見てみましょう誰もがすぐにエッジの場合にどのように手続きの応答を把握することはできませんどのような場合には?あなたや私が1時間パズルを解くのに何がかかるかもしれませんが、著者には数分かかる場合があります。

  1. 唯一の例外がありました。2007年かそこらで、このセグメントでの大量のネットワーク活動に気づきました。事務所の外にいるように見える人の機械から来たので、1日置いて調べてみました。当日は、半日留守だったので、手が強制されました。彼女が今度の結婚式のためにLimewireとBearshareからCDをダウンロードしていたことがわかりました。私はそれを彼女の上司に引き渡して話し合った。彼は何もしないことにしましたが、それが組織を訴訟の危険にさらすので、少なくとも知っているべきだと私は思いました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.