我在我的數據庫中有大約500個表格,每個表格最少有100列。我們共有5人在同一個數據庫中工作。因此,無論何時需求出現,都會添加一個新列或表格。我保留一條記錄,但我的同事沒有這樣做。所以我現在面臨的問題是,現有表中是否有其他人創建了列或創建了新表。如何知道現有表格中創建了哪個列?
因此,任何人都可以告訴我是否可以知道是否將新列添加到現有表中,並且如果添加了什麼是列名?
我在我的數據庫中有大約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服務器UI更改,但會跟蹤同一查詢中的多個更改
丟棄的列可以由着色器標識。您會發現訂單將會丟失,但列信息您將無法看到。
如果您提供表名稱和日期時間,它會給出隨訂單更改的列。 如果它不返回任何值,則表示在表格上沒有任何更改。
感謝您的答案,但我怎麼知道哪些列被修改 – SpringLearner
我不確定SQL-Server是否真的在某處記錄這些細節。無論如何,我正在挖掘關於這些信息的系統表。 –
這裏的canara和colorder是什麼? – SpringLearner
可能是這個查詢幫助您
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
列上的日期時間篩選器篩選出。
感謝piyush回答,檢查你的答案,它給了我,我已經改變了一些列,從未改變的一些列 – SpringLearner
這沒有給改變的時間 –
@SpringLearner: - 你可以使用日期過濾器來獲取範圍內的修改後的值 – HaveNoDisplayName
答案可能在這裏:/ questions/1231831/sql-server-diff-tool – Jasen
你應該重新考慮你的開發過程。沒有人應該被允許「改變」表格。每個更改都應放入SQL腳本並存儲在版本控制系統中。理想地確定它所屬的應用程序的版本。查看Liquibase或Flyway的工具,幫助您管理模式遷移。 –
@a_horse_with_no_name是的,你是對的。我會按照你的理解去做但是,一切都已經發生了,那麼我現在怎麼得到增加的列呢? – SpringLearner