2015-01-10 36 views
1

我在我的數據庫中有大約500個表格,每個表格最少有100列。我們共有5人在同一個數據庫中工作。因此,無論何時需求出現,都會添加一個新列或表格。我保留一條記錄,但我的同事沒有這樣做。所以我現在面臨的問題是,現有表中是否有其他人創建了列或創建了新表。如何知道現有表格中創建了哪個列?

因此,任何人都可以告訴我是否可以知道是否將新列添加到現有表中,並且如果添加了什麼是列名?

+0

答案可能在這裏:/ questions/1231831/sql-server-diff-tool – Jasen

+6

你應該重新考慮你的開發過程。沒有人應該被允許「改變」表格。每個更改都應放入SQL腳本並存儲在版本控制系統中。理想地確定它所屬的應用程序的版本。查看Liquibase或Flyway的工具,幫助您管理模式遷移。 –

+0

@a_horse_with_no_name是的,你是對的。我會按照你的理解去做但是,一切都已經發生了,那麼我現在怎麼得到增加的列呢? – SpringLearner

回答

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服務器UI更改,但會跟蹤同一查詢中的多個更改

丟棄的列可以由着色器標識。您會發現訂單將會丟失,但列信息您將無法看到。

如果您提供表名稱和日期時間,它會給出隨訂單更改的列。 如果它不返回任何值,則表示在表格上沒有任何更改。

+0

感謝您的答案,但我怎麼知道哪些列被修改 – SpringLearner

+0

我不確定SQL-Server是否真的在某處記錄這些細節。無論如何,我正在挖掘關於這些信息的系統表。 –

+0

這裏的canara和colorder是什麼? – SpringLearner

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列上的日期時間篩選器篩選出。

+0

感謝piyush回答,檢查你的答案,它給了我,我已經改變了一些列,從未改變的一些列 – SpringLearner

+0

這沒有給改變的時間 –

+0

@SpringLearner: - 你可以使用日期過濾器來獲取範圍內的修改後的值 – HaveNoDisplayName

相關問題