SQL Server 저장 프로 시저 개정 기록을 유지하는 방법


22

참고 : 전체 버전 제어에 대해서는 묻지 않습니다.

SQL Server에서 저장 프로 시저 기록을 자동으로 유지할 수있는 방법이 있습니까?

Google 문서가 문서 버전의 기록을 자동으로 유지하고 위키 백과가 기사 버전의 기록을 자동으로 유지하는 방법과 유사합니다.

저장 프로 시저를 업데이트하는 사용자가 저장 프로 시저의 저장소를 유지하기를 원하지 않습니다. 이것은 너무 많은 일이며 사람들은 그렇게하지 않을 것입니다.

잘하면 이것이 SQL Server에서 켤 수있는 것입니다 ...

(그리고 저장 프로시 저는 실제로 함수, 트리거 등을 의미합니다. 기본적으로 프로그래밍 가능한 모든 것).

/programming/14522224/how-to-keep-history-of-sql-server-stored-procedure-revisions first cos에 게시하여 더 많은 뷰를 얻을 것이라고 생각합니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
폴 화이트 GoFundMonica 말한다

답변:


31

소스 제어가 올바른 방법이라고 전적으로 동의하지만 모든 환경이 그 자체에만 의존 할만큼 충분히 훈련되지는 않았으며 앱을 유지하기 위해 직접 변경해야 할 수도 있음을 이해합니다. 실행, 클라이언트를 저장, 당신은 무엇입니까.

DDL 트리거를 사용하여 테이블의 모든 개정을 별도의 데이터베이스에 보관할 수 있습니다 (물론 데이터베이스를 자주 백업). 유틸리티 데이터베이스가 있다고 가정합니다.

USE Utility;
GO


CREATE TABLE dbo.ProcedureChanges
(
    EventDate    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    EventType    NVARCHAR(100),
    EventDDL     NVARCHAR(MAX),
    DatabaseName NVARCHAR(255),
    SchemaName   NVARCHAR(255),
    ObjectName   NVARCHAR(255),
    HostName     NVARCHAR(255),
    IPAddress    VARCHAR(32),
    ProgramName  NVARCHAR(255),
    LoginName    NVARCHAR(255)
);

이제 데이터베이스에서 먼저 저장 프로 시저의 현재 버전 인 "초기 제어"라고 부르는 항목을 살펴 보겠습니다.

USE YourDB;
GO

INSERT Utility.dbo.ProcedureChanges
(
    EventType,
    EventDDL,
    DatabaseName,
    SchemaName,
    ObjectName
)
SELECT
    N'Initial control',
    OBJECT_DEFINITION([object_id]),
    DB_NAME(),
    OBJECT_SCHEMA_NAME([object_id]),
    OBJECT_NAME([object_id])
FROM
    sys.procedures;

후속 변경 사항을 캡처하려면 데이터베이스에 DDL 트리거를 추가하십시오.

USE YourDB;
GO

CREATE TRIGGER CaptureStoredProcedureChanges
    ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @EventData XML = EVENTDATA(), @ip VARCHAR(32);

    SELECT @ip = client_net_address
        FROM sys.dm_exec_connections
        WHERE session_id = @@SPID;

    INSERT Utility.dbo.ProcedureChanges
    (
        EventType,
        EventDDL,
        SchemaName,
        ObjectName,
        DatabaseName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]',   'NVARCHAR(100)'), 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        DB_NAME(), HOST_NAME(), @ip, PROGRAM_NAME(), SUSER_SNAME();
END
GO

시간이 지남에 따라 절차의 ​​변경 사항을보고 비교하는 것이 쉬워지고, 시스템에 새로운 절차가 추가되는 것을보고, 절차가 중단되는 것을보고, 이러한 이벤트에 대해 누가 이야기해야하는지에 대한 좋은 아이디어를 갖게됩니다.

자세한 내용은 여기 :

http://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/


2
+1 가장 간단하고 고유 한 방법입니다. 내 생각에 이것은 OP가 찾고있는 대답입니다.
토마스 스트링거

그러나 이것은 OP의 문제에 대한 해결책으로 갈 것입니다.
Marian

이 답변이 마음에 들면 추가 비용없이 자동 버전 관리가 가능하기 때문에이 답변이 마음에 듭니다. 소스 제어와 동일하지는 않지만 무시해서는 안되는 소중한 안전망이라는 데 동의합니다.
Daniel Williams

2

SQL 소스 코드를 버전 제어하에 자동으로 유지할 수있는 방법이 없다고 생각합니다. 네이티브 SQL Server 도구를 의미합니다. 나는 당신이 git 또는 svn을 사용할 수 있다고 생각하지만, 나에게 가장 좋은 해결책은 데이터베이스 및 저장 프로 시저를 버전 제어하에 유지 하기 위해 Red Gate의 소스 제어 를 구입하는 것이 었습니다 .


1
물론 DDL 트리거는 타사 도구가 필요 없이이 작업을 수행 할 수 있습니다 (내 답변 참조). 물론 소스 제어는 훨씬 뛰어난 제어 및 감사 기능을 제공하며, 타사 도구는 자신이 작성하려는 것보다 훨씬 더 많은 기능을 제공하지만 직접 변경으로부터 보호 할 수있는 방법은 없습니다. 소스 제어 프로토콜을 따르는 모든 사람에게 (항상 가능한 것은 아님).
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.