在数据库中部署多个表

时间:2013-06-14 23:05:58

标签: sql-server deployment

我们正在使用Microsoft SQL Server 2008 R2。我有一个包含100个表的数据库。其中20个是我的配置。有时,我需要更新我们的配置并将这20个表部署到字段(生产,测试等)。其他80个表需要保留。我查看了bcp和SSIS等选项。您对此有何建议或经验?

3 个答案:

答案 0 :(得分:0)

创建脚本文件,其中'truncate table tablename'作为第一行,然后是一串'insert'语句来填充表格。您可以在一个文件中放置所有20个表'刷新',或在每个文件中放置一个表。

答案 1 :(得分:0)

我建议使用像liquibase这样的数据库迁移工具。将每个更改都置于版本控制下的数据库中。

以下示例以H2数据库为目标,但liquibase也为supports sql server。 Liquibase是一个java工具,但可以在Windows上的命令行中使用。

示例(管理架构)

执行update操作如下:

liquibase --url=jdbc:h2:db/scottTiger \
          --driver=org.h2.Driver \
          --username=user \
          --password=pass \
          --classpath=/path/to/db/jar/h2-1.3.172.jar \
          --changeLogFile=scottTiger.sql \
          update

此命令将查看specially formatted sql文件中定义的更改集,并仅运行缺少的更改。

这意味着数据库可以就地更新(迁移)或从头开始构建。

scottTiger.sql

--liquibase formatted sql

--changeset mark:1
CREATE TABLE BONUS (ENAME VARCHAR(10) NOT NULL, JOB VARCHAR(9) NOT NULL, SAL DECIMAL(7, 2), COMM DECIMAL(7, 2));
ALTER TABLE BONUS ADD CONSTRAINT BONUS_PK PRIMARY KEY (ENAME, JOB);
--rollback DROP TABLE BONUS;

--changeset mark:2
CREATE TABLE DEPARTMENT (DEPTNO INT NOT NULL, NAME VARCHAR(14), LOCATION VARCHAR(13), CONSTRAINT DEPT_PK PRIMARY KEY (DEPTNO));
--rollback DROP TABLE DEPARTMENT;


--changeset mark:3
CREATE TABLE EMPLOYEE (EMPNO INT NOT NULL, NAME VARCHAR(10), JOB VARCHAR(9), BOSS INT, HIREDATE VARCHAR(12), SALARY DECIMAL(7, 2), COMM DECIMAL(7, 2), DEPTNO INT, CONSTRAINT EMP_PK PRIMARY KEY (EMPNO));
ALTER TABLE PUBLIC.EMPLOYEE ADD CONSTRAINT BOSS_FK FOREIGN KEY (BOSS) REFERENCES PUBLIC.EMPLOYEE (EMPNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
ALTER TABLE PUBLIC.EMPLOYEE ADD CONSTRAINT DEPARTMENT_FK FOREIGN KEY (DEPTNO) REFERENCES PUBLIC.DEPARTMENT (DEPTNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
--rollback DROP TABLE EMPLOYEE;


--changeset mark:4
CREATE TABLE PROJECT (PROJECTNO INT NOT NULL, DESCRIPTION VARCHAR(100), START_DATE VARCHAR(12), END_DATE VARCHAR(12), CONSTRAINT PROJECT_PK PRIMARY KEY (PROJECTNO));
--rollback DROP TABLE PROJECT;

--changeset mark:5
CREATE TABLE ROLE (ROLE_ID INT NOT NULL, DESCRIPTION VARCHAR(100), CONSTRAINT ROLE_PK PRIMARY KEY (ROLE_ID));
--rollback DROP TABLE ROLE;


--changeset mark:6
CREATE TABLE PROJECT_PARTICIPATION (PROJECTNO INT NOT NULL, EMPNO INT NOT NULL, START_DATE VARCHAR(12) NOT NULL, END_DATE VARCHAR(12), ROLE_ID INT);
ALTER TABLE PROJECT_PARTICIPATION ADD CONSTRAINT PARTICIPATION_PK PRIMARY KEY (PROJECTNO, EMPNO, START_DATE);
ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT EMPLOYEE_FK FOREIGN KEY (EMPNO) REFERENCES PUBLIC.EMPLOYEE (EMPNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT PROJECT_FK FOREIGN KEY (PROJECTNO) REFERENCES PUBLIC.PROJECT (PROJECTNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT ROLE_FK FOREIGN KEY (ROLE_ID) REFERENCES PUBLIC.ROLE (ROLE_ID) ON UPDATE RESTRICT ON DELETE RESTRICT;
--rollback DROP TABLE PROJECT_PARTICIPATION;

--changeset mark:7
CREATE TABLE SALARYGRADE (GRADE INT NOT NULL, LOSAL INT NOT NULL, HISAL INT NOT NULL, CONSTRAINT SALGRADE_PK PRIMARY KEY (GRADE));
--rollback DROP TABLE SALARYGRADE;

注意:

  • 每个变更集都有一个唯一的名称。 Liquibase记录了针对您的数据库实例执行的每个变更集
  • 可以定义rollback个动作。撤消数据库更改的非常有用的功能。

示例(管理数据)

Liquibase有一个有用的context feature,可用于管理表数据。

以下示例在命令行中指定“dev”上下文:

liquibase --url=jdbc:h2:db/scottTiger \
          --driver=org.h2.Driver \
          --username=user \
          --password=pass \
          --classpath=/path/to/db/jar/h2-1.3.172.jar \
          --changeLogFile=scottTiger.sql \
          --contexts=dev
          update

scottTiger.sql

在变更集文件中,可选地为每个变更集指示上下文。这使liquibase能够有选择地运行特定的变更集:

--changeset mark:8 context:dev
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (1,2,3);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (2,2,3);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (3,2,3);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (4,2,3);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (5,2,3);
--rollback DELETE FROM SALARYGRADE;

--changeset mark:9 context:test
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (1,20,30);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (2,20,30);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (3,20,30);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (4,20,30);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (5,20,30);
--rollback DELETE FROM SALARYGRADE;

--changeset mark:10 context:prod
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (1,200,300);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (2,200,300);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (3,200,300);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (4,200,300);
INSERT INTO SALARYGRADE (GRADE,LOSAL,HISAL) VALUES (5,200,300);
--rollback DELETE FROM SALARYGRADE;

答案 2 :(得分:0)

我们有很多用户使用database change management features中的BuildMaster来管理您描述的工作流程。

首先,无论您使用什么工具/技术,都必须从创建要运行一次(并且只运行一次)的更改脚本(SQL)开始。可以多次运行的更改(例如创建存储过程,视图等)可以存储在源代码管理中,并在每次部署完成后运行。

在BuildMaster中配置应用程序后,您可以设置多个数据库连接(Test,Stage,Prod等),并在环境之间自动执行更改交付。您还可以生成部署工具(.exe)供开发人员或环境之外的数据库使用。

(免责声明:我为Inedo工作)