Answers:
这将记录到默认跟踪中,因此,只要启用它并且在此期间没有翻转,它就应该出现在“ Schema Changes History”报告中。
要在Management Studio中访问它,请右键单击数据库,然后从上下文菜单中选择 Reports -> Standard Reports -> Schema Changes History
要通过TSQL检索相同的信息,您可以使用
SELECT StartTime
,LoginName
--,f.*
FROM sys.traces t
CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
CHARINDEX('\', REVERSE(t.path)),
260)
) + N'log.trc', DEFAULT) f
WHERE t.is_default = 1
AND ObjectName = 'FOO'
AND EventClass IN (46, /*Object:Created*/
47, /*Object:Dropped*/
164 /*Object:Altered*/ )
Object:Created
事件,以防万一视图被删除和创建而不是更改。不知道不在服务器上执行意味着什么?当然,您需要连接到正确的实例,但是只要您具有权限,连接的来源就无关紧要。
SELECT path FROM sys.traces where is_default=1
马丁已经指出了最佳途径,通常是行政审计跟踪(除非已被明确禁用)。 如果您无法在管理跟踪中找到该信息(已禁用或已回收),则可以从日志备份中检索该信息。由于是生产数据库,因此我假设您有一个定期的备份周期,其中包含定期的完整备份和日志备份。您将需要在另一台服务器上将数据库还原到事件发生前后,以便DDL位于当前还原的日志中。这是使用fn_dblog()
和检查日志的简单问题。
一种方法是按事务开始操作:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';
如果ALTER VIEW
是在独立交易中发行的(即未被BEGIN TRANSACTION
/COMMIT
),它将开始一个名为的交易CreatProc transaction
。查找它,这[Transaction SID]
是您想要的登录SID。
另一种可能性是在所需的视图上查找获得SCH_M的事务:
select [Lock Information], *
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go
请注意,如果先后通过DROP更改视图,然后再创建CREATE,则对象ID可能已更改,但是至少您会获得最后一次执行CREATE的事务(已还原数据库中视图的当前对象ID)。使用交易ID,您可以返回并获取开始交易信息:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';
[交易SID]还是您的同伴。用于SUSER_SNAME
从登录SID检索登录名。如果SID为0x01,则表示登录为sa
,这意味着任何知道sa
密码的个人都可以这样做。
如果还没有,您可能想查看SQL Server Management Studio中提供的“ 架构更改历史记录”报告。看起来默认情况下SQL Server日志更改(默认跟踪),您应该能够通过此报告查看该数据。唯一不幸的是,这些跟踪文件会随着时间的流逝而自动删除/翻转,因此数据可能已经消失了。祝好运!