【问题标题】:How table was created in SQL-Server表是如何在 SQL-Server 中创建的
【发布时间】:2016-11-07 14:24:59
【问题描述】:

我需要找到的是重新创建一些表的过程,使用了哪些数据源,如果有的话是哪些脚本&c。那么,如果表是手动创建的还是通过查询创建的,以及数据是从外部数据还是从数据库中现有的表/视图导入的,是否有可能以某种方式区分,可能是在系统视图或类似视图中?我已经知道谁创造了,什么时候创造的。我几乎筛选了整个数据库而没有结果,现在我正在寻找元数据中的提示。

【问题讨论】:

  • 没有这样的元数据。与存储过程不同,表仅作为其内部表示形式存储。创建它们的脚本不会记录在任何地方。从引擎的角度来看,没有办法“手动创建表”——所有事情最终都会发生在(可能生成的)CREATE TABLE 语句中。 (或者SELECT INTO,如果你想学究气的话。)
  • 没有办法知道创建表的来源。想想这个……到头来都只是在执行一个sql脚本。 SSMS 只是为您创建一个脚本并执行它。
  • 您可以使用RedGate等第三方工具找到create table语句。当您将数据库项目关联到您的解决方案中时,您可以找到另一种方法。在这两种情况下,您可以搜索 create table 'TableName'。
  • 附带说明,如果您想监控 CREATE TABLE 事件,您可能需要查看DDL Triggers

标签: sql-server metadata


【解决方案1】:

如果表是最近创建的,您可以从默认跟踪中收集信息。下面的查询将列出对象创建和更改的事件。默认跟踪是翻转跟踪,因此取证信息将根据活动受到限制。

SELECT  
     trace.DatabaseName
    ,trace.ObjectName
    ,te.name AS EventName
    ,tsv.subclass_name
    ,trace.EventClass
    ,trace.EventSubClass
    ,trace.StartTime
    ,trace.EndTime
    ,trace.NTDomainName
    ,trace.NTUserName
    ,trace.HostName
    ,trace.ApplicationName
    ,trace.Spid
FROM (SELECT REVERSE(STUFF(REVERSE(path), 1, CHARINDEX(N'\', REVERSE(path)), '')) + N'\Log.trc' AS path
    FROM sys.traces WHERE is_default = 1) AS default_trace_path
CROSS APPLY fn_trace_gettable(default_trace_path.path, DEFAULT) AS trace
JOIN sys.trace_events AS te ON 
    trace.EventClass=te.trace_event_id
JOIN sys.trace_subclass_values AS tsv ON
    tsv.trace_event_id = EventClass
    AND tsv.subclass_value = trace.EventSubClass
WHERE te.name IN(N'Object:Altered', N'Object:Created')
    AND tsv.subclass_name = 'Commit'
ORDER BY trace.StartTime;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2022-11-03
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多