首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server外键审核/跟踪

Server外键审核/跟踪
EN

Stack Overflow用户
提问于 2017-05-18 18:16:21
回答 3查看 469关注 0票数 1

我有一个SQL Server 2008 DB,外键神秘地消失了。数据库由许多定制软件、MS查询和访问。在从数据库中添加、修改或删除外键时,我希望设置某种类型的日志/审核。我该怎么做?理想情况下,更改将写入SQL表,并帮助确定是谁进行了更改。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-19 11:40:10

创建表时,可以创建触发器来存储对数据库的更改。全文:http://www.sqlbook.com/sql-server/using-ddl-triggers-in-sql-server-to-audit-database-objects/

代码语言:javascript
复制
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)')
) 
票数 1
EN

Stack Overflow用户

发布于 2017-05-19 11:01:49

Stack Overflow用户

发布于 2017-05-18 19:56:31

Stivan在上面的评论中给出了我的问题的答案。如果他把它作为一个答案,我将把它转换为接受的答案。尽管如此,在执行Create/Alter/Drop语句时,我向希望跟踪的DB添加了一个DDL审核表,并添加了一个DB触发器来填充它。我运行的查询如下所示:

代码语言:javascript
复制
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)')
) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44055153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档