Sql 如何知道在现有表中创建了哪一列?

Sql 如何知道在现有表中创建了哪一列?,sql,sql-server,Sql,Sql Server,我的数据库中大约有500个表,每个表至少有100列。我们总共有5个人在同一个数据库中工作。因此,每当需要时,就会添加一个新的列或表。我所做的任何更改,我保留了一个记录,但我的同事没有这样做。所以我现在面临的问题是,其他人在现有表中创建了哪些列,或者创建了一个新表 因此,有谁能告诉我,是否有可能知道是否向现有表中添加了一个新列,如果添加了,列名称是什么?使用下面的查询,您可以找到最近更改的表 查询以了解上次更改的表 SELECT * FROM sys.tables order by modify_

我的数据库中大约有500个表,每个表至少有100列。我们总共有5个人在同一个数据库中工作。因此,每当需要时,就会添加一个新的列或表。我所做的任何更改,我保留了一个记录,但我的同事没有这样做。所以我现在面临的问题是,其他人在现有表中创建了哪些列,或者创建了一个新表


因此,有谁能告诉我,是否有可能知道是否向现有表中添加了一个新列,如果添加了,列名称是什么?

使用下面的查询,您可以找到最近更改的表

查询以了解上次更改的表

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

着色剂可以识别掉的色谱柱。您将发现缺少订单,但无法看到列信息

如果提供表名和日期时间,则会给出按顺序更改的列。
如果它不返回任何值,则表示表上没有任何更改

使用下面的查询,您可以找到最近更改的表

查询以了解上次更改的表

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

着色剂可以识别掉的色谱柱。您将发现缺少订单,但无法看到列信息

如果提供表名和日期时间,则会给出按顺序更改的列。
如果它不返回任何值,则表示表上没有任何更改

这个查询对您有帮助吗

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列上的datetime筛选器进行筛选

这个查询对您有帮助吗

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列上的datetime筛选器进行筛选

答案可能在这里:/questions/1231831/sql server diff tool您应该重新思考您的开发过程。任何人都不应该被允许仅仅改变桌子。每个更改都应放入SQL脚本并存储在版本控制系统中。理想情况下,标识应用程序所属的版本。查看Liquibase或Flyway,寻找帮助您管理架构迁移的工具。@a_horse_和_no_name是的,您是对的。我将按照youcnow继续操作,但由于所有事情都发生了,我现在如何添加列?我们的应用程序Sql Historian sqlhistorian.tessik.com可以为您完成这项工作,并将所有数据库更改存储在Subversion或TFS中。是否有新旧数据库的副本?或者您只是想通过修改后的数据库来解决这个问题?答案可能在这里:/questions/1231831/sql server diff tool您应该重新思考您的开发过程。任何人都不应该被允许仅仅改变桌子。每个更改都应放入SQL脚本并存储在版本控制系统中。理想情况下,标识应用程序所属的版本。查看Liquibase或Flyway,寻找帮助您管理架构迁移的工具。@a_horse_和_no_name是的,您是对的。我将按照youcnow继续操作,但由于所有事情都发生了,我现在如何添加列?我们的应用程序Sql Historian sqlhistorian.tessik.com可以为您完成这项工作,并将所有数据库更改存储在Subversion或TFS中。是否有新旧数据库的副本?或者你只是想用修改过的数据库来解决这个问题?谢谢你的回答,但是我怎么知道哪些列是修改过的呢?我不确定SQL Server是否真的在某个地方记录了这些详细信息。无论如何,我正在挖掘系统表中关于这些信息的信息。这里的canara和colorder是什么?打字错误。感谢@piyush的编辑。Colorder是创建的列的顺序。上次创建的列将具有该表中最高的颜色。我尝试使用您的查询。实际上,我在一个表中创建了2列,但是当我执行查询时,它只给出了一个列名。谢谢你的回答,但是我如何知道哪些列被修改?我不确定SQL Server是否真的将这些详细信息记录在某个地方。无论如何,我正在挖掘系统表中关于这些信息的信息。这里的canara和colorder是什么?打字错误。感谢@piyush的编辑。着色剂
是创建的列的顺序。上次创建的列将具有该表中最高的颜色。我尝试使用您的查询。实际上,我在一个表中创建了2个col,但当我执行您的查询时,它只给出一个列名感谢Piyus的回答,并与您的答案进行了核对,它给了我一些我已经改变的栏目,还有一些从未改变过的栏目。这并没有给出时间change@SpringLearner:-您可以使用日期筛选器在range@Piyush从今天起的3个月内,我如何才能获得专栏名称?@SpringLearner:-请参阅回答中的编辑部分感谢皮尤斯的回答,根据你的回答,它给了我一些我已经改变的栏目,还有一些从未改变过的栏目。这并没有给出时间change@SpringLearner:-您可以使用日期筛选器在range@Piyush如何在从今天起的3个月内获得栏目名称?@SpringLearner:-请参阅答案中的编辑部分