我的数据库中有大约500个表,每个表至少有100列。我们共有5个人在同一个数据库中工作。所以每当需求出现时,都会添加一个新列或一个表。我什么都没有进行更改,我保留了记录,但我的同事没有这样做。所以我现在面临的问题是其他人在现有表中创建了列,或者创建了新表。
那么有人可以告诉我是否可以知道是否有新列添加到现有表中并且是否添加了列名称?
答案 0 :(得分:3)
可能是此查询可以帮助您
SELECT
t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name,
modify_date, create_date
FROM
sys.tables AS t
INNER JOIN
sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
ORDER BY
modify_date DESC
修改强>
要审核此项,您必须使用DDL触发器
第1步: - 创建新的审计表
CREATE TABLE DDLAudit
(
PostTime datetime, DatabaseName varchar(256), Event nvarchar(100),
ObjectName varchar(256), TSQL nvarchar(2000), Login varchar(256)
)
步骤2: - 创建DDL触发器
CREATE TRIGGER AuditChanges
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)')
)
现在,每次更改都会记录在您的DDLAudit
中。您可以根据PostTime
列上的日期时间过滤器过滤掉。
答案 1 :(得分:1)
使用以下查询,您可以找到最近更改过的表格。
查询以了解上次更改的表
SELECT * FROM sys.tables
order by modify_date desc
查询以了解列已更改
SELECT TOP (select count(distinct(TransactionID))
from ::fn_trace_gettable( LEFT((select path from sys.traces where is_default = 1 ),len((select path from sys.traces where is_default = 1 )) - PATINDEX('%\%', reverse((select path from sys.traces where is_default = 1 )))) + '\log.trc', default )
where EventClass in (46,47,164) and EventSubclass = 0 and
DatabaseID <> 2 and
ObjectName='table1' and StartTime>'2015-01-10 00:00:00') [name],[colorder]
FROM [sys].[syscolumns]
where id=(SELECT object_id FROM sys.tables
where name='table1')
order by colorder desc
注意:如果删除了任何列,或者使用SQL Server UI更改了表的多个列,但在同一查询中跟踪多个alter,则此查询将不起作用
可以通过着色器识别丢弃的列。您会发现订单将丢失,但您将无法看到列信息。
如果您提供表名和日期时间,则会提供按顺序更改的列。 如果它没有返回任何值,则表示表中没有进行任何更改。