2017-05-18 14 views
1

私は不思議なことに消滅している外部キーを持つSQL Server 2008 DBを持っています。 DBには、多数のカスタム構築ソフトウェア、MS Excelクエリ、およびSQL Server Management Studioからアクセスできます。外部キーがデータベースに追加、変更、または削除されたときに、何らかのログ/監査を設定したいと思います。それをどうやってやりますか?理想的には、変更はSQLテーブルに書き込まれ、誰が変更を行ったのかを特定するのに役立ちます。SQL Serverの外部キー監査/追跡

+0

http://www.sqlbook.com/sql-server/using-ddl-triggers-in-sql-server-to-audit-database-objects/ – Stivan

+0

私はできませんこれを答え(スタックオーバーフローに関する新機能)としてマークしているようですが、この記事の例では、制約の変更を含むCreate、Alter、およびDropのテーブルステートメントのログをどのように記録できるかを示しています。 – fireflyfiend

答えて

1

一つのテーブルを作成するには、データベースへの変更を保存するためのトリガーを作成することができます。 記事全文:http://www.sqlbook.com/sql-server/using-ddl-triggers-in-sql-server-to-audit-database-objects/

CREATE TRIGGER AuditProcChanges 
ON DATABASE 
FOR CREATE_PROC, ALTER_PROC, DROP_PROC, CREATE_TABLE, ALTER_TABLE, DROP_TABLE 
AS 

DECLARE @ed XML 
SET @ed = EVENTDATA() 

INSERT INTO DDLAudit (PostTime, DatabaseName, Event, ObjectName, TSQL, Login) 
VALUES 
(
    GetDate(), 
    @ed.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'), 
    @ed.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
    @ed.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'), 
    @ed.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'), 
    @ed.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)') 
) 
0

スティーブンは私の質問に対する答えを上記のコメントで提供しました。彼が答えとしてそれを提出すれば、私は受け入れられた答えにそれを切り替えるでしょう。つまり、追跡したいDBにDDL監査テーブルを追加し、Create/Alter/Drop Tableステートメントを実行したときにDBトリガーを追加しました。私が実行したクエリは以下の通りです:

USE DBName 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[DDLAudit](
    [RowID] [int] IDENTITY(1,1) NOT NULL, 
    [PostTime] [datetime] NULL, 
    [DatabaseName] [varchar](256) NULL, 
    [Event] [nvarchar](100) NULL, 
    [ObjectName] [varchar](256) NULL, 
    [TSQL] [nvarchar](2000) NULL, 
    [Login] [varchar](256) NULL, 
CONSTRAINT [PK_DDLAudit] PRIMARY KEY CLUSTERED 
(
    [RowID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

CREATE TRIGGER AuditProcChanges 
ON DATABASE 
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE 
AS 

DECLARE @ed XML 
SET @ed = EVENTDATA() 

INSERT INTO DDLAudit (PostTime, DatabaseName, Event, ObjectName, TSQL, Login) 
VALUES 
(
GetDate(), 
@ed.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'), 
@ed.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
@ed.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'), 
@ed.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'), 
@ed.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)') 
) 
関連する問題