2015-01-10 5 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 서버가 실제로 이러한 세부 정보를 어딘지에 기록할지 모르겠습니다. 어쨌든 나는 그 정보에 대해 시스템 테이블을 파고있다. –

+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

답변을 확인해 주셔서 감사합니다. 답변을 확인해 주셔서 감사합니다. 변경된 항목도 변경되었습니다. – SpringLearner

+0

변경 시간이 없습니다. –

+0

@SpringLearner : - 수 있습니다. 날짜 필터를 사용하여 범위 내의 수정 값을 얻습니다. – HaveNoDisplayName

관련 문제