Liquibase에서 XML 변경 세트를 작성하는 방법

17926 단어 liquibase
작성자: Suresh Regmi
Liquibase에 대한 기본적인 이해를 원한다면, 이전에 Liquibase를 사용하여 데이터베이스 버전 제어에 관한 글을 읽어보시기 바랍니다 https://www.turtle-techies.com/database-version-controler-with-liquibase/.
시스템에liquibase를 설치했다고 가정합니다.
없으면, 리퀴베이스의 공식 문서 https://www.liquibase.org/get-started/first-steps 를 참조하십시오.
본고에서 우리는 변경 로그, 변경 집합, 그리고 어떻게 XML 형식으로 변경 집합을 작성하는지에 대한 예시를 토론할 것이다.
변경 세트를 작성할 때 언급된 데이터베이스는 Oracle입니다.
사용 중인 데이터베이스에 따라 제가 제공한 코드의 일부 값을 변경해야 할 수도 있습니다. 예를 들어 드라이버 상세 정보, 연결 파라미터, 데이터 형식 등입니다.

일부 배경 정보


변경 로그


변경 로그는 변경 집합의 집합입니다.변경 로그는 SQL, XML, JSON 및 YAML 형식으로 작성할 수 있습니다.
변경 로그에는 선행 조건, 속성, 변경 세트, 포함, 컨텍스트 등의 중첩 요소가 포함될 수 있습니다.

변경 집합


liquibase의 변경 집합은 데이터베이스에 대한 단일 변경 사항을 나타냅니다.
모든 변경 집합은 업무에서 실행되며, 오류가 있는지 여부에 따라 제출되거나 롤백됩니다.
각 변경 세트는 ID, AUTHOR 및 변경 로그 파일의 디렉토리와 파일 이름으로 고유하게 식별됩니다.

조직 변경 로그 파일부터


변경 로그 파일은 두 가지 방법으로 관리할 수 있습니다. 변경 로그 파일을 만들고 모든 변경 집합을 이 파일에 추가하거나 여러 개의 파일을 생성하고 버스트 변경 집합을 뛰어넘을 수 있습니다.
내 경험에 따르면 후자는 관리하기 쉽고 장점이 많다.
데이터베이스 대상과 발표 버전을 바탕으로 변경 집합을 분리하면 더욱 조직적인 방식으로 변경을 관리하는 데 도움이 된다.
만약 기초 데이터베이스가 있고 리퀴베이스를 이 프로젝트에 실현하기를 원한다면, 서로 다른 폴더에 초기 테이블, 데이터와 과정에 변경 집합을 추가하고, 발표 버전에 따라 데이터베이스 업데이트를 관리할 수 있습니다.
발행판 관리 변경 로그 파일을 기반으로 하면 발행판의 일부분으로 변경된 사항을 이해하고 다른 개발자에게 더욱 쉽습니다.
민첩한 환경에서 일하는 것은 조직 변경 일지의 예이다. 내가 가장 많이 사용하고 다른 사람들에게 따르라고 건의한다.
여러 파일에서 변경 집합을 구성하고 주 변경 로그 파일의 데이터베이스 변경 로그에 있는include 태그를 사용하여 파일과 실행 순서를 정의하는 것도 좋아합니다.

또한 중첩된 요소를 포함하는 주 변경 로그 파일을 정의하여 파일의 실행 순서를 정의할 수 있습니다.다음은 순서대로 실행할 다른 변경 집합 파일을 포함하여 주 변경 로그 파일의 예시를 보여 줍니다.


<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <include file="Initial-Changesets/Initial-Tables/Initial-Tables.xml" relativeToChangelogFile="true" />
    <include file="Initial-Changesets/Initial-Procedures/Initial-Procedures.xml" relativeToChangelogFile="true" />
    <include file="Initial-Changesets/Initial-Data/Initial-Data.xml" relativeToChangelogFile="true" />
    <include file="Updates/Release-1.1-Updates.xml" relativeToChangelogFile="true" />
    <include file="Updates/Release-1.2-Updates.xml" relativeToChangelogFile="true" />

</databaseChangeLog>


여기에서 저는 EMPLOYEE와 DEPARTMENT 두 개의 표를 예로 들어 리퀴베이스에서 변경 집합을 작성하는 다른 방법을 설명해 드리겠습니다.

1. liquibase XML을 사용하여 테이블을 만드는 방법


우리는 하나의 변경 집합에서 하나 이상의 표를 만들 수 있다.
우리는createTable 표기 내에서 NOT NULL 제약, 메인 키와 외부 키 등을 정의할 수 있다.
테이블 태그를 작성하는 동안 구속조건을 정의할 수도 있습니다.
다음은 단일 변경 세트에서 테이블 DEPARTMENT 및 EMPLOYEES를 작성하는 예입니다.


<changeSet author="Author1" id="1">
 <createTable tableName="DEPARTMENT">
   <column name="ID" type="NUMBER">
     <constraints nullable="false" primaryKey="true"/>
   </column>
   <column name="DEPT_NAME" type="VARCHAR2(100 BYTE)">
   <constraints nullable="false"/>
   </column>
   <column name="DEPT_DESCRIPTION" type="VARCHAR2(1000 BYTE)">
   </column>
 </createTable>

 <createTable tableName="EMPLOYEES">
   <column name="ID" type="NUMBER">
     <constraints nullable="false" primaryKey="true"/>
   </column>
   <column name="NAME" type="VARCHAR2(100 BYTE)">
   </column>
   <column name="DEPARTMENT_ID" type="NUMBER">
     <constraints nullable="false" foreignKeyName="DEPARTMENT_ID_FK" references="DEPARTMENT(ID)"/>
   </column>
   <column name="DESIGNATION" type="VARCHAR2(250 BYTE)"/>
   <column name="SALARY" type="NUMBER"/>
 </createTable>

 <addNotNullConstraint columnName="NAME" tableName="EMPLOYEES"/>
</changeSet>

변경 집합을 만들 때, 변경 집합에서 하나의 데이터베이스 변경을 사용하는 것을 권장합니다. 그러면 변경 집합의 데이터베이스 변경에 오류가 있으면 전체 변경 집합을 굴릴 필요가 없습니다.
예를 들어 주어진 변경 집합에서 EMPLOYEES 테이블에 오류가 있으면 Liquibase는 DEPARTMENT 테이블을 만든 후에 실패합니다. 따라서 오류를 해결한 다음 실행에서 테이블 DEPARTMENT가 생성되었음을 나타내는 이상을 던집니다.따라서 오류가 발생하기 전의 변경 사항을 수동으로 스크롤해야 합니다.

2. SQL 파일을 사용하여 데이터 삽입


Liquibase를 사용하면 외부 파일에 저장된 SQL을 실행할 수 있습니다.
Liquibase가 변경 집합을 지원하지 않는 상황에서 대량 삽입이 발생하고 사용자가 다른 Liquibase 변경 로그 대체 방안(예를 들어 XML, JSON, YAML)이 아닌 SQL 내용을 사용하는 경향이 있는 경우 이 점은 매우 가치가 있다.
다음은 외부 SQL 파일을 사용하여 EMPLOYEES 테이블에 레코드를 삽입하는 방법입니다.

<changeSet author="Author1" id="2">
 <sqlFile dbms="oracle"
          encoding="utf8"
          endDelimiter=";"
          path="Release1_SQL/insert_into_employees_file.sql"
          relativeToChangelogFile="true"
          splitStatements="true"
          stripComments="true"/>
</changeSet>

SQL 파일
---- DEPARTMENT
Insert into DEPARTMENT (ID,DEPT_NAME,DEPT_DESCRIPTION) values (1,'D1','D1 Department');

---- EMPLOYEES
Insert into EMPLOYEES (ID,NAME,DEPARTMENT_ID,DESIGNATION,SALARY) values (1,'John Doe',1,'Developer',50000);

3. SQL 태그를 사용하여 SQL 문장을 작성하는 방법


Liquibase에서는 원하는 SQL을 실행하기 위해 XML 변경 세트에서 SQL을 작성할 수도 있습니다.
복잡한 변경 집합이liquibase 자동화 변경 집합의 지원을 받지 않을 때 유용할 수 있습니다.
다음은 SQL 태그를 사용하여 복잡한 변경 내용을 작성한 예입니다.

<changeSet author="Author1" id="2">
 <sql dbms="oracle"
      endDelimiter=";"
      splitStatements="true"
      stripComments="true">
   MERGE INTO EMPLOYEES  dest
   USING  (SELECT 2   AS id, 'John Doe2'  AS Name,  1 AS DEPARTMENT_ID, 'Clerk'  AS DESIGNATION, 40000 AS SALARY  FROM   dual) src
   ON (dest.id = src.id )
   WHEN NOT matched THEN
   INSERT (dest.ID,dest.NAME,dest.DEPARTMENT_ID,dest.DESIGNATION,dest.SALARY) VALUES  (src.ID,src.NAME,src.DEPARTMENT_ID,src.DESIGNATION,src.SALARY) ;
 </sql>
</changeSet>

4. 프로세스 및 트리거를 만드는 방법


Liquibase의 createProcedure 태그를 사용하거나 사용자 정의 SQL 변경 세트 생성/실행 프로세스 및 트리거를 사용할 수 있습니다.
Liquibase에서 CREATE OR REPLACE 기능을 사용하려면 runOnChange='true'를 설정하면 실행할 때 저장 프로세스를 만들거나 업데이트할 수 있습니다.

<changeSet author="Author1" id="4" runOnChange="true">
   <createProcedure
           encoding="utf8"
           procedureName="LIST_EMPLOYEES_BY_DEPT">
<![CDATA[CREATE OR REPLACE PROCEDURE "LIST_EMPLOYEES_BY_DEPT" (
 P_PARAM1    IN EMPLOYEES.DEPARTMENT_ID%TYPE,
 RETURNCURSOR    OUT SYS_REFCURSOR) AS
BEGIN
 OPEN RETURNCURSOR FOR
 SELECT * 
 FROM EMPLOYEES
 WHERE DEPARTMENT_ID=P_PARAM1;
END LIST_EMPLOYEES_BY_DEPT;
]]>    
   </createProcedure>
</changeSet>

5. changelog 매개 변수를 어떻게 사용합니까


Liquibase는 변경 로그의 매개변수를 전역 변경 로그 매개 변수를 정의하고 ${parameter-name} 구문을 사용하여 동적으로 바꿀 수 있도록 합니다.
명령줄 매개 변수, 속성 파일, 데이터베이스 변경 로그 파일의 매개 변수 블록 등 여러 가지 방법으로 매개 변수 값을 설정할 수 있다.
다음은 liquibase에서 changelog 파라미터를 사용하는 예입니다.속성 파일:

changeLogFile: target/classes/changelog/master.xml
driver: oracle.jdbc.OracleDriver

url: ${schema.connection.url}
username: ${schema.user}
password: ${schema.password}

# ChangeLog Parameters
client.name: ${dept.name}

changeSet에서 changelog 매개변수를 사용합니다.

<changeSet author="Author1" id="5">
 <sql dbms="oracle"
      endDelimiter=";"
      splitStatements="true"
      stripComments="true">
  UPDATE DEPARTMENT SET DEPT_DESCRIPTION='D1 Department New' WHERE DEPT_NAME= '${dept.name}' ;
 </sql>
</changeSet>

Changelog 파일의 Changelog 매개변수

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property  name="table.name"  value="TEST_TABLE"/>  

    <changeSet  author="Author1"  id="6" >  
         <createTable  tableName="${table.name}">  
             <column  name="id"  type="int"/>  
             <column  name="column1"  type="varchar2(10)"/>  
             <column  name="column2"  type="int"/>  
         </createTable>  
    </changeSet>  
</databaseChangeLog>

이게 다야!


응용 프로그램 개발 과정이 진행됨에 따라 점점 더 많은 데이터베이스 변경이 개발팀에서 이루어지고 개발팀은 이러한 변경을 유지하고 감독해야 한다.
이러한 예제에서는 객체 생성, 데이터 삽입 및 마이그레이션, SQL 태그를 이용한 DDL과 DML 조합, 변경 로그 매개변수 정의 등 데이터베이스의 대부분의 마이그레이션 작업을 수행할 수 있습니다.

좋은 웹페이지 즐겨찾기