การกำหนดเวอร์ชันฐานข้อมูล SQL Server


315

ฉันต้องการรับฐานข้อมูลภายใต้การควบคุมเวอร์ชัน ใครบ้างมีคำแนะนำหรือบทความแนะนำให้ฉันเริ่มต้น

ฉันมักจะต้องการที่จะมีอย่างน้อยบางข้อมูลที่อยู่ในนั้น (เป็นalumbกล่าวถึง: ประเภทของผู้ใช้และผู้ดูแลระบบ) ฉันมักจะต้องการชุดข้อมูลทดสอบที่สร้างขึ้นจำนวนมากสำหรับการวัดประสิทธิภาพ


ดูกระดาษสีขาวนี้ด้วย คำแนะนำที่ชัดเจนเกี่ยวกับการควบคุมเวอร์ชันของฐานข้อมูลwww3.dbmaestro.com/…
DBAstep

คำตอบ:


179

ฟาวเลอร์มาร์ตินเขียนบทความที่ชื่นชอบในเรื่องที่http://martinfowler.com/articles/evodb.html ฉันเลือกที่จะไม่ทิ้งสคีมาภายใต้การควบคุมเวอร์ชันตามที่เป็นคนโง่และคนอื่น ๆ แนะนำเพราะฉันต้องการวิธีที่ง่ายในการอัพเกรดฐานข้อมูลการผลิตของฉัน

สำหรับเว็บแอปพลิเคชันที่ฉันจะมีอินสแตนซ์ฐานข้อมูลการผลิตเดียวฉันใช้สองเทคนิค:

สคริปต์อัพเกรดฐานข้อมูล

สคริปต์อัพเกรดฐานข้อมูลลำดับที่มี DDL ที่จำเป็นในการย้ายสกีมาจากเวอร์ชัน N ถึง N + 1 (สิ่งเหล่านี้จะอยู่ในระบบควบคุมเวอร์ชันของคุณ) ตาราง _version_history_ คล้าย ๆ

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

รับรายการใหม่ทุกครั้งที่สคริปต์อัปเกรดทำงานซึ่งสอดคล้องกับเวอร์ชันใหม่

สิ่งนี้ทำให้มั่นใจได้ว่าเป็นเรื่องง่ายที่จะเห็นว่ามีสกีมาฐานข้อมูลเวอร์ชันใดอยู่ สิ่งเหล่านี้ไม่ใช่การทิ้งฐานข้อมูล ค่อนข้างแต่ละสคริปต์แสดงถึงการเปลี่ยนแปลงที่จำเป็นในการย้ายจากรุ่นหนึ่งไปเป็นรุ่นถัดไป เป็นสคริปต์ที่คุณใช้กับฐานข้อมูลการผลิตเพื่อ "อัปเกรด"

การประสานข้อมูลนักพัฒนา Sandbox

  1. สคริปต์สำหรับการสำรองข้อมูลทำให้สะอาดและลดขนาดฐานข้อมูลการผลิต รันสิ่งนี้หลังจากการอัปเกรดแต่ละครั้งเป็นฐานข้อมูลการผลิต
  2. สคริปต์ที่จะกู้คืน (และปรับแต่งหากจำเป็น) สำรองข้อมูลบนเวิร์กสเตชันของผู้พัฒนา นักพัฒนาซอฟต์แวร์แต่ละคนจะเรียกใช้สคริปต์นี้หลังจากที่อัปเกรดเป็นฐานข้อมูลการผลิต

คำเตือน: การทดสอบอัตโนมัติของฉันทำงานกับฐานข้อมูลที่ถูกต้อง แต่ไม่มีสคีมาดังนั้นคำแนะนำนี้จะไม่ตรงกับความต้องการของคุณอย่างสมบูรณ์


16
เวอร์ชันที่ควบคุมสคริปต์สกีมาแบบเต็มมีประโยชน์อย่างมากสำหรับการอ้างอิง ตัวอย่างเช่นมันเป็นไปไม่ได้ที่จะเห็นสิ่งที่ถูกเปลี่ยนแปลงในขั้นตอนการจัดเก็บโดยดูที่คำสั่ง ALTER PROCEDURE
Constantin

12
การดัมพ์ (และเวอร์ชัน) สกีมา DB แบบเต็มหลังจากรันสคริปต์อัพเกรดใหม่เป็นวิธีที่ดีในการทำให้ข้อมูลพร้อมใช้งานกับเครื่องมืออื่น ๆ ในกระบวนการสร้าง / ปรับใช้ของคุณเช่นกัน นอกจากนี้การมี schema แบบเต็มในสคริปต์หมายความว่าสามารถ "หมุน" ฐานข้อมูลใหม่โดยไม่ต้องทำตามขั้นตอนการโอนย้ายทั้งหมด นอกจากนี้ยังทำให้สามารถกระจายเวอร์ชันปัจจุบันกับเวอร์ชั่นก่อนหน้าสะสม
mlibby

2
กำลังบอกว่าคุณใส่สคริปต์อัพเกรดในการควบคุมแหล่งที่มาอ่อนนุชไม่ได้ใส่สคริปต์ย้อนกลับที่นั่น?
AK

9
ฉันมีนิสัยในการรักษาสคริปต์สร้างและวางแบบเต็มรวมถึงสคริปต์เดลต้าสำหรับการปรับปรุงอินสแตนซ์ฐานข้อมูลที่มีอยู่ให้ทันสมัย ทั้งสองเข้าไปในการควบคุมเวอร์ชัน สคริปต์เดลต้าถูกตั้งชื่อตามหมายเลขการแก้ไข ด้วยวิธีนี้ทำให้ง่ายต่อการปรับแก้ db โดยอัตโนมัติด้วยสคริปต์อัพเดต
nikc.org

1
@ คำตอบของ nikc.org รวมถึงตะขอหลังการกระทำสำหรับระบบอัตโนมัติ
Silviu-Marian

45

ผลิตภัณฑ์เปรียบเทียบ SQL ของ Red Gate ไม่เพียง แต่ช่วยให้คุณทำการเปรียบเทียบระดับวัตถุและสร้างสคริปต์การเปลี่ยนแปลงจากนั้น แต่ยังช่วยให้คุณสามารถส่งออกวัตถุฐานข้อมูลของคุณไปยังลำดับชั้นของโฟลเดอร์ที่จัดเรียงตามประเภทวัตถุด้วยการสร้างหนึ่ง สคริปต์ต่อวัตถุในไดเรกทอรีเหล่านี้ ลำดับชั้นชนิดของวัตถุเป็นดังนี้:

\ ฟังก์ชั่น
\ Security
\ Security \ บทบาท
\ Security \ Schemas
\ Security \ Users
\ วิธีการจัดเก็บ
\ ตาราง

หากคุณถ่ายโอนสคริปต์ของคุณไปยังไดเรกทอรีรากเดียวกันหลังจากที่คุณทำการเปลี่ยนแปลงคุณสามารถใช้สิ่งนี้เพื่ออัปเดต SVN repo ของคุณและเก็บประวัติการทำงานของแต่ละวัตถุ


6
เราเพิ่งเปิดตัวการควบคุมแหล่งที่มาของ SQL ซึ่งรวมลักษณะการเปรียบเทียบ SQL ที่คุณอธิบายไว้ใน SSMS และลิงก์ไปยัง SVN และ TFS ฉันได้เพิ่มคำตอบแยกต่างหากสำหรับคำถามนี้ซึ่งอธิบายรายละเอียดเพิ่มเติมว่ามันทำอะไร red-gate.com/products/SQL_Source_Control/index.htm
David Atkinson

39

นี่เป็นหนึ่งใน "ปัญหาที่ยาก" โดยรอบการพัฒนา เท่าที่ฉันรู้ไม่มีวิธีแก้ไขปัญหาที่สมบูรณ์แบบ

หากคุณต้องการจัดเก็บโครงสร้างฐานข้อมูลเท่านั้นไม่ใช่ข้อมูลที่คุณสามารถส่งออกฐานข้อมูลเป็นแบบสอบถาม SQL (ใน Enterprise Manager: คลิกขวาที่ฐานข้อมูล -> สร้างสคริปต์ SQL ฉันขอแนะนำให้ตั้งค่า "สร้างหนึ่งไฟล์ต่อวัตถุ" บนแท็บตัวเลือก) จากนั้นคุณสามารถส่งไฟล์ข้อความเหล่านี้ไปยัง svn และใช้ฟังก์ชั่น diff และการบันทึกของ svn

ฉันมีสิ่งนี้เชื่อมโยงกับสคริปต์ชุดที่ใช้พารามิเตอร์คู่และตั้งค่าฐานข้อมูล ฉันยังเพิ่มแบบสอบถามเพิ่มเติมที่ป้อนข้อมูลเริ่มต้นเช่นประเภทผู้ใช้และผู้ใช้ที่เป็นผู้ดูแลระบบ (ถ้าคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้โพสต์บางอย่างและฉันสามารถทำให้สคริปต์เข้าถึงได้)

หากคุณต้องการเก็บข้อมูลทั้งหมดไว้เช่นกันฉันแนะนำให้ทำการสำรองข้อมูลและใช้ผลิตภัณฑ์ Redgate ( http://www.red-gate.com/ ) เพื่อทำการเปรียบเทียบ พวกเขาไม่ได้มาถูก แต่พวกเขาก็คุ้มค่าทุกเพนนี


1
เกี่ยวกับข้อมูล - คุณสามารถใช้OffScale DataGroveเพื่อบันทึกเวอร์ชันของ DB ทั้งหมดของคุณ (รวมข้อมูล) คุณสามารถใช้มันเพื่อวางไข่สำเนาเสมือนจริงสองชุดของฐานข้อมูลซึ่งสามารถเปรียบเทียบกับผลิตภัณฑ์ของประตูสีแดง นอกจากนี้ยังช่วยให้คุณไม่จำเป็นต้องสร้างข้อมูลทดสอบ - คุณสามารถบันทึกรุ่นของฐานข้อมูลเพื่อให้ตรงกับกรณีทดสอบที่แตกต่างกัน (อีกครั้ง, เต็มรูปแบบ, สำเนาเสมือนจริงของฐานข้อมูลทั้งหมด)
Taichman

1
คุณทำงานออกคำสั่งใดเพื่อเรียกใช้สคริปต์ฐานข้อมูลหากคุณใช้ตัวเลือก "หนึ่งไฟล์ต่อวัตถุ"
เจมี่คิทสัน

@Taichman: DataGrove ดูเหมือนจะไม่สนับสนุนเซิร์ฟเวอร์ SQL และดังนั้นจึงไม่มีความเกี่ยวข้องกับคำถาม
Neolisk

38

ก่อนอื่นคุณต้องเลือกระบบควบคุมเวอร์ชันที่เหมาะสมกับคุณ:

  • ระบบควบคุมเวอร์ชันกลาง - ระบบมาตรฐานที่ผู้ใช้เช็คเอาท์ / เช็คอินก่อน / หลังทำงานกับไฟล์และไฟล์จะถูกเก็บไว้ในเซิร์ฟเวอร์ส่วนกลางเดียว

  • Distributed Version Control system - ระบบที่ที่เก็บข้อมูลถูกโคลนและแต่ละ clone คือการสำรองข้อมูลทั้งหมดของ repository จริงดังนั้นถ้าเซิร์ฟเวอร์ใด ๆ ล้มเหลวจากนั้นที่เก็บโคลนสามารถใช้เพื่อเรียกคืนหลังจากเลือกระบบที่เหมาะสมกับความต้องการของคุณ คุณจะต้องตั้งค่าพื้นที่เก็บข้อมูลซึ่งเป็นแกนหลักของทุกระบบควบคุมเวอร์ชันทั้งหมดนี้อธิบายไว้ในบทความต่อไปนี้: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding -source ควบคุมพื้นฐาน /

หลังจากตั้งค่าพื้นที่เก็บข้อมูลและในกรณีของระบบกลางการควบคุมเวอร์ชันโฟลเดอร์การทำงานคุณสามารถอ่านบทความนี้ มันแสดงให้เห็นถึงวิธีการตั้งค่าการควบคุมแหล่งที่มาในสภาพแวดล้อมการพัฒนาโดยใช้:

  • SQL Server Management Studio ผ่านผู้ให้บริการ MSSCCI

  • Visual Studio และเครื่องมือข้อมูล SQL Server

  • เครื่องมือของบุคคลที่สาม ApexSQL Source Control

24

ที่ Red Gate เรามีเครื่องมือตัวควบคุมแหล่งข้อมูล SQLซึ่งใช้เทคโนโลยี SQL Compare เพื่อเชื่อมโยงฐานข้อมูลของคุณกับที่เก็บ TFS หรือ SVN เครื่องมือนี้รวมเข้ากับ SSMS และช่วยให้คุณทำงานได้ตามปกติยกเว้นตอนนี้จะช่วยให้คุณสามารถมอบหมายวัตถุได้

สำหรับวิธีการโอนย้ายข้อมูล (เหมาะกว่าสำหรับการปรับใช้อัตโนมัติ) เรานำเสนอSQL Change Automation (เดิมชื่อ ReadyRoll) ซึ่งสร้างและจัดการชุดของสคริปต์ที่เพิ่มขึ้นเป็นโครงการ Visual Studio

ในการควบคุมแหล่ง SQL เป็นไปได้ที่จะระบุตารางข้อมูลแบบคงที่ เหล่านี้จะถูกเก็บไว้ในการควบคุมแหล่งที่มาเป็นคำสั่ง INSERT

หากคุณกำลังพูดถึงข้อมูลทดสอบเราขอแนะนำให้คุณสร้างข้อมูลทดสอบด้วยเครื่องมือหรือผ่านสคริปต์การปรับใช้หลังที่คุณกำหนดหรือเพียงแค่เรียกคืนข้อมูลสำรองการผลิตไปยังสภาพแวดล้อม dev


ผลิตภัณฑ์ที่น่าสนใจ (บิตของช่องว่างในตลาด) แต่ deltas เก็บไว้เป็น "สร้าง ... " ทำให้ฉันตกใจ คุณแยก / รวมตัวเป็นอย่างไร
annakata

1
เราจัดเก็บคำจำกัดความของวัตถุเป็น CREATE แต่ถ้าคุณ 'รับล่าสุด' หรือตัวอย่างเช่นใช้ SQL Compare Pro เพื่อสร้างสคริปต์การซิงค์สิ่งเหล่านี้จะเปลี่ยนเป็นคำสั่งที่เหมาะสมเช่น ALTER หากต้องการแยกหรือรวมคุณเพียงแค่ใช้ระบบควบคุมแหล่งที่มาของคุณเช่นเดียวกับที่คุณทำอยู่ในปัจจุบัน
David Atkinson

คำตอบนี้ซ้ำกับคำตอบของ Dane ที่โพสต์เมื่อสองปีก่อน
WonderWorker

มันเป็นคำตอบที่แตกต่าง SQL Compare ไม่ใช่ฐานข้อมูลการควบคุมเวอร์ชันในขณะที่ SQL Source Control ได้รับการออกแบบมาโดยเฉพาะ
David Atkinson

21

คุณอาจต้องการดู Liquibase ( http://www.liquibase.org/ ) แม้ว่าคุณจะไม่ได้ใช้เครื่องมือเองมันก็จัดการกับแนวคิดของการจัดการการเปลี่ยนแปลงฐานข้อมูลหรือการปรับโครงสร้างใหม่ให้ดี


เราใช้ Liquibase ใน 5 ทีมกระจายในสาขาเดียวสำหรับการจัดส่งอย่างต่อเนื่องและมันใช้งานได้ดี เรามีแอปพลิเคชั่นฐานข้อมูลมากกว่า 10 ตัวที่ติดตั้งในสภาพแวดล้อมต่างๆ เราใช้เพื่อจัดการสคีมาการทำดัชนีการแบ่งพาร์ติชันรหัสข้อมูลการค้นหากลุ่มและสิทธิ์ของกลุ่ม เราใช้สำหรับ Oracle, Postgresql และ MSSQL
Peter Henell

ถ้าฉันเข้าใจอย่างถูกต้องตามคำนำคุณต้องรู้ภาษา xml ที่เป็นกรรมสิทธิ์เพื่อประกาศวัตถุของคุณแทนที่จะเป็น SQL ใช่หรือไม่ ไม่ใช่แฟน
JDPeckham

19

+1 สำหรับทุกคนที่แนะนำเครื่องมือ RedGate พร้อมคำแนะนำเพิ่มเติมและข้อควรระวัง

SqlCompare ยังมีเอกสาร API ที่เหมาะสม: ดังนั้นคุณสามารถเขียนแอปคอนโซลซึ่งซิงค์โฟลเดอร์สคริปต์ที่ควบคุมด้วยซอร์สของคุณกับฐานข้อมูลการทดสอบการรวม CI บนเช็คอินดังนั้นเมื่อมีคนตรวจสอบการเปลี่ยนแปลงสคีมาจากโฟลเดอร์สคริปต์ของพวกเขา มันถูกปรับใช้โดยอัตโนมัติพร้อมกับการเปลี่ยนรหัสแอปพลิเคชันที่ตรงกัน สิ่งนี้ช่วยปิดช่องว่างกับผู้พัฒนาที่ลืมเกี่ยวกับการเผยแพร่การเปลี่ยนแปลงในฐานข้อมูลท้องถิ่นของพวกเขาจนถึงฐานข้อมูลการพัฒนาที่ใช้ร่วมกัน (ประมาณครึ่งหนึ่งของพวกเราฉันคิดว่า :))

ข้อแม้คือว่าด้วยวิธีการเขียนสคริปต์หรือมิฉะนั้นเครื่องมือ RedGate ราบรื่นพอที่จะง่ายต่อการลืมเกี่ยวกับความเป็นจริงของ SQL ที่เป็นนามธรรมที่เป็นนามธรรม หากคุณเปลี่ยนชื่อคอลัมน์ทั้งหมดในตาราง SqlCompare จะไม่มีวิธีแมปคอลัมน์เก่ากับคอลัมน์ใหม่และจะลบข้อมูลทั้งหมดในตาราง มันจะสร้างคำเตือน แต่ฉันเห็นคนคลิกผ่านไปแล้ว มีจุดทั่วไปที่นี่คุ้มค่าฉันคิดว่าคุณสามารถกำหนดรุ่น DB และอัปเกรดอัตโนมัติได้ - นามธรรมมีการรั่วไหลมาก


ดังนั้นควรมีระบบที่ติดตามว่าคอลัมน์ใดที่คุณกำลังเปลี่ยนแปลงและจดจำการแมปจากชื่อคอลัมน์เก่าไปยังชื่อคอลัมน์ใหม่
Silver

โปรดทราบว่าสำหรับการเปลี่ยนแปลงฐานข้อมูลที่มีความกำกวม (และจำเป็นต้องมีองค์ประกอบของ "เจตนาของนักพัฒนา") โซลูชันที่ใช้การย้ายข้อมูลเป็นโซลูชันที่เหมาะสม ขณะนี้ Redgate มี ReadyRoll ที่สอดคล้องกับวิธีการกำหนดเวอร์ชันนี้
David Atkinson

15

เราใช้DBGhostเพื่อจัดการฐานข้อมูล SQL ของเรา จากนั้นคุณวางสคริปต์ของคุณเพื่อสร้างฐานข้อมูลใหม่ในการควบคุมเวอร์ชันของคุณและมันจะสร้างฐานข้อมูลใหม่หรืออัปเกรดฐานข้อมูลใด ๆ ที่มีอยู่เป็นสกีมาในการควบคุมเวอร์ชัน ด้วยวิธีนี้คุณไม่ต้องกังวลเกี่ยวกับการสร้างสคริปต์การเปลี่ยนแปลง (แม้ว่าคุณจะยังสามารถทำได้เช่นถ้าคุณต้องการเปลี่ยนชนิดข้อมูลของคอลัมน์และจำเป็นต้องแปลงข้อมูล)


ฉันใช้ DbGhost มา 10 ปีแล้วและมันก็ไม่ทำให้ฉันผิดหวัง การสนับสนุนที่พวกเขาให้นั้นไม่เป็นสองรองใคร
penderi

15

ด้วย VS 2010 ให้ใช้โครงการฐานข้อมูล

  1. สคริปต์ฐานข้อมูลของคุณ
  2. ทำการเปลี่ยนแปลงสคริปต์หรือโดยตรงบนเซิร์ฟเวอร์ db ของคุณ
  3. ซิงค์โดยใช้ข้อมูล> สคีมาเปรียบเทียบ

สร้างโซลูชันการกำหนดรุ่น DB ที่สมบูรณ์แบบและทำให้การซิงค์ของฐานข้อมูลเป็นเรื่องง่าย


2
ใช่ แต่น่าเสียดายที่คุณต้องจำไว้ว่า "สร้างสคริปต์" ทุกครั้ง หากคุณอัพเดตฐานข้อมูลโดยตรงคุณจะสูญเสียความสามารถในการสร้างสคริปต์การอัพเดทสำหรับเดลต้านั้น หากโครงการฐานข้อมูลเท่านั้นที่จะมีฟังก์ชั่นในตัวสำหรับการกำหนดรุ่น
Jez

13

เป็นวิธีที่ดีในการบันทึกสคริปต์ฐานข้อมูลลงในการควบคุมเวอร์ชันด้วยสคริปต์การเปลี่ยนแปลงเพื่อให้คุณสามารถอัปเกรดฐานข้อมูลใด ๆ ที่คุณมี นอกจากนี้คุณอาจต้องการบันทึกสกีมาสำหรับเวอร์ชันต่าง ๆ เพื่อให้คุณสามารถสร้างฐานข้อมูลแบบเต็มโดยไม่ต้องใช้สคริปต์การเปลี่ยนแปลงทั้งหมด การจัดการสคริปต์ควรเป็นแบบอัตโนมัติเพื่อให้คุณไม่ต้องทำงานด้วยตนเอง

ฉันคิดว่ามันสำคัญที่จะต้องมีฐานข้อมูลแยกต่างหากสำหรับนักพัฒนาทุกคนและไม่ใช้ฐานข้อมูลที่ใช้ร่วมกัน ด้วยวิธีนี้นักพัฒนาสามารถสร้างกรณีทดสอบและขั้นตอนการพัฒนาได้อย่างอิสระจากผู้พัฒนารายอื่น

เครื่องมืออัตโนมัติควรมีความหมายสำหรับการจัดการข้อมูลเมตาของฐานข้อมูลซึ่งบอกว่าฐานข้อมูลใดอยู่ในสถานะของการพัฒนาและตารางใดที่มีข้อมูลที่สามารถควบคุมเวอร์ชันได้เป็นต้น


12

คุณสามารถดูโซลูชันการย้ายข้อมูล สิ่งเหล่านี้ช่วยให้คุณสามารถระบุสกีมาฐานข้อมูลของคุณในรหัส C # และม้วนฐานข้อมูลเวอร์ชันขึ้นและลงโดยใช้ MSBuild

ฉันใช้DbUpอยู่ในขณะนี้และใช้งานได้ดี


11

คุณไม่ได้กล่าวถึงเฉพาะเจาะจงเกี่ยวกับสภาพแวดล้อมหรือข้อ จำกัด เป้าหมายของคุณดังนั้นสิ่งนี้อาจไม่สามารถใช้งานได้ทั้งหมด ... แต่ถ้าคุณกำลังมองหาวิธีที่จะติดตาม schema DB ที่มีการพัฒนาอย่างมีประสิทธิภาพ Ruby การโยกย้ายของ ActiveRecord นั้นอยู่ในซอยของคุณ

การย้ายข้อมูลกำหนดโปรแกรมแปลงฐานข้อมูลโดยใช้ Ruby DSL; การแปลงแต่ละครั้งสามารถนำไปใช้หรือย้อนกลับ (โดยปกติ) ช่วยให้คุณสามารถข้ามไปยังเวอร์ชันที่แตกต่างกันของสคีมา DB ของคุณตามเวลาที่กำหนด ไฟล์ที่กำหนดการเปลี่ยนแปลงเหล่านี้สามารถตรวจสอบได้ในการควบคุมเวอร์ชันเช่นเดียวกับรหัสอื่น ๆ

เนื่องจากการโยกย้ายเป็นส่วนหนึ่งของActiveRecordพวกเขามักจะพบการใช้งานในแอพ Rails แบบเต็มสแต็ค; อย่างไรก็ตามคุณสามารถใช้ ActiveRecord โดยอิสระจาก Rails ด้วยความพยายามเพียงเล็กน้อย ดูที่นี่สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการรักษาโดยใช้การย้ายถิ่นของ AR นอก Rails


10

ทุกฐานข้อมูลควรอยู่ภายใต้การควบคุมของรหัสที่มา สิ่งที่ขาดหายไปคือเครื่องมือที่จะสคริปต์วัตถุฐานข้อมูลทั้งหมดโดยอัตโนมัติและ "ข้อมูลการกำหนดค่า" ไปยังไฟล์ซึ่งจะสามารถเพิ่มลงในระบบควบคุมแหล่งใดก็ได้ หากคุณกำลังใช้ SQL Server แล้ววิธีการแก้ปัญหาของฉันอยู่ที่นี่: http://dbsourcetools.codeplex.com/ มีความสุข. - นาธาน


9

มันง่ายมาก

  1. เมื่อโครงการฐานพร้อมแล้วคุณต้องสร้างสคริปต์ฐานข้อมูลแบบเต็ม สคริปต์นี้มุ่งมั่นที่จะ SVN มันเป็นรุ่นแรก

  2. หลังจากนั้นผู้พัฒนาทั้งหมดจะสร้างสคริปต์การเปลี่ยนแปลง (ALTER ... , ตารางใหม่, sprocs, ฯลฯ )

  3. เมื่อคุณต้องการเวอร์ชันปัจจุบันคุณควรเรียกใช้สคริปต์การเปลี่ยนแปลงใหม่ทั้งหมด

  4. เมื่อเปิดตัวแอพสู่การผลิตคุณจะกลับไปที่ 1 (แต่จะเป็นเวอร์ชั่นต่อเนื่องแน่นอน)

Nant จะช่วยให้คุณสามารถรันสคริปต์การเปลี่ยนแปลงเหล่านั้นได้ :)

และจำไว้ว่า. ทุกอย่างทำงานได้ดีเมื่อมีระเบียบวินัย ทุกครั้งที่มีการยอมรับการเปลี่ยนแปลงฐานข้อมูลดังนั้นฟังก์ชั่นที่เกี่ยวข้องในโค้ดก็ถูกส่งไปด้วยเช่นกัน


2
หลังจากหลายปีที่ฉันพูดว่า: ใช้ FluentMigrator (หรือเครื่องมือที่คล้ายกันสำหรับแพลตฟอร์มของคุณ)
dariol

8

หากคุณมีฐานข้อมูลขนาดเล็กและคุณต้องการรุ่นสิ่งทั้งหมดสคริปต์ชุดนี้อาจช่วยได้ มันแยกบีบอัดและตรวจสอบไฟล์ MDF ฐานข้อมูล MSSQL ในการโค่นล้ม

หากคุณต้องการให้คีเวอร์ชันของคุณเป็นส่วนใหญ่และมีข้อมูลอ้างอิงเพียงเล็กน้อยคุณอาจใช้SubSonic Migrationsเพื่อจัดการกับสิ่งนั้น ประโยชน์ที่ได้รับคือคุณสามารถโยกย้ายขึ้นหรือลงไปยังรุ่นใดก็ได้โดยง่าย


8

ในการทำให้การถ่ายโอนข้อมูลไปยังระบบควบคุมซอร์สโค้ดนั้นเร็วขึ้นเล็กน้อยคุณสามารถดูว่าวัตถุใดเปลี่ยนแปลงไปตั้งแต่ครั้งที่แล้วโดยใช้ข้อมูลรุ่นใน sysobjects

ตั้งค่า:สร้างตารางในแต่ละฐานข้อมูลที่คุณต้องการตรวจสอบแบบเพิ่มหน่วยเพื่อเก็บข้อมูลเวอร์ชันจากครั้งล่าสุดที่คุณตรวจสอบ (ว่างในการเรียกใช้ครั้งแรก) ล้างตารางนี้หากคุณต้องการสแกนโครงสร้างข้อมูลทั้งหมดอีกครั้ง

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

โหมดการทำงานปกติ:คุณสามารถรับผลลัพธ์จาก sql นี้และสร้างสคริปต์ sql สำหรับสิ่งที่คุณสนใจและนำมาไว้ในการควบคุมแหล่งที่คุณเลือก

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

หมายเหตุ:หากคุณใช้การเปรียบเทียบที่ไม่ได้มาตรฐานในฐานข้อมูลใด ๆ ของคุณคุณจะต้องแทนที่/* COLLATE */ด้วยการเปรียบเทียบฐานข้อมูลของคุณ กล่าวคือCOLLATE Latin1_General_CI_AI


8

เนื่องจากแอปของเราต้องทำงานกับ RDBMS หลายตัวเราจึงจัดเก็บคำจำกัดความสคีมาของเราไว้ในการควบคุมเวอร์ชันโดยใช้รูปแบบแรงบิดฐานข้อมูลที่เป็นกลาง(XML) นอกจากนี้เรายังควบคุมข้อมูลอ้างอิงสำหรับฐานข้อมูลของเราในรูปแบบ XML ดังนี้ (โดยที่ "ความสัมพันธ์" เป็นหนึ่งในตารางอ้างอิง):

  <Relationship RelationshipID="1" InternalName="Manager"/>
  <Relationship RelationshipID="2" InternalName="Delegate"/>
  etc.

จากนั้นเราใช้เครื่องมือที่สร้างขึ้นเองเพื่อสร้างสกีมาการอัพเกรดและการอ้างอิงข้อมูลการอัพเกรดสคริปต์ที่จำเป็นต้องใช้ในการเปลี่ยนจากเวอร์ชัน X ของฐานข้อมูลเป็นเวอร์ชัน X + 1


7

เราไม่เก็บสกีมาฐานข้อมูล แต่เราเก็บการเปลี่ยนแปลงลงในฐานข้อมูล สิ่งที่เราทำคือเก็บการเปลี่ยนแปลงสคีมาเพื่อให้เราสร้างสคริปต์การเปลี่ยนแปลงสำหรับฐานข้อมูลเวอร์ชันใด ๆ และนำไปใช้กับฐานข้อมูลลูกค้าของเรา ฉันเขียนแอพพลิเคชั่นยูทิลิตี้ฐานข้อมูลที่แจกจ่ายให้กับแอพพลิเคชั่นหลักของเราที่สามารถอ่านสคริปต์นั้นและรู้ว่าต้องมีการอัพเดตใดบ้าง นอกจากนี้ยังมีฉลาดพอที่จะฟื้นฟูมุมมองและขั้นตอนการจัดเก็บตามที่ต้องการ


7

เราต้องการรุ่นฐานข้อมูล SQL ของเราหลังจากที่เราย้ายไปยังแพลตฟอร์ม x64 และรุ่นเก่าของเราหยุดการโยกย้าย เราเขียนแอปพลิเคชัน C # ซึ่งใช้ SQLDMO เพื่อแมปวัตถุ SQL ทั้งหมดไปยังโฟลเดอร์:

                ราก
                    ชื่อเซิร์ฟเวอร์
                       ฐาน
                          วัตถุสคีมา
                             ทริกเกอร์ฐานข้อมูล *
                                .ddltrigger.sql
                             ฟังก์ชั่น
                                ..function.sql
                             ความปลอดภัย
                                บทบาท
                                   บทบาทของแอปพลิเคชัน
                                      .approle.sql
                                   บทบาทฐานข้อมูล
                                      .role.sql
                                schemas *
                                   .schema.sql
                                ผู้ใช้
                                   .user.sql
                             การเก็บรักษา
                                แค็ตตาล็อกข้อความแบบเต็ม *
                                   .fulltext.sql
                             ขั้นตอนการจัดเก็บ
                                ..proc.sql
                             พ้อง *
                                .synonym.sql
                             ตาราง
                                ..table.sql
                                ข้อ จำกัด
                                   ... chkconst.sql
                                   ... defconst.sql
                                ดัชนี
                                   ... index.sql
                                คีย์
                                   ... fkey.sql
                                   ... pkey.sql
                                   ... ukey.sql
                                ทริกเกอร์
                                   ... trigger.sql
                             ประเภท
                                ประเภทข้อมูลที่ผู้ใช้กำหนด
                                   ..uddt.sql
                                คอลเล็กชัน XML Schema *
                                   ..xmlschema.sql
                             เข้าชม
                                ..view.sql
                                ดัชนี
                                   ... index.sql
                                ทริกเกอร์
                                   ... trigger.sql

แอปพลิเคชันจะเปรียบเทียบเวอร์ชันที่เขียนใหม่กับเวอร์ชันที่เก็บไว้ใน SVN และหากมีความแตกต่างก็จะอัปเดต SVN เรากำหนดว่าการเรียกใช้กระบวนการหนึ่งครั้งต่อคืนก็เพียงพอแล้วเนื่องจากเราไม่ได้ทำการเปลี่ยนแปลงกับ SQL จำนวนมาก มันช่วยให้เราสามารถติดตามการเปลี่ยนแปลงของวัตถุทั้งหมดที่เราสนใจรวมถึงช่วยให้เราสามารถสร้างสคีมาเต็มรูปแบบในกรณีที่เกิดปัญหาร้ายแรง


Oooh นี่จะเป็นการดีที่จะเผยแพร่สู่สาธารณะ
Chris Charabaruk

7

ฉันได้เขียนแอพพลิเคชั่นนี้เมื่อไม่นานมานี้http://sqlschemasourcectrl.codeplex.com/ซึ่งจะสแกนฐานข้อมูล MSFT SQL ของคุณบ่อยเท่าที่คุณต้องการและถ่ายโอนวัตถุของคุณโดยอัตโนมัติ (ตารางมุมมอง procs ฟังก์ชันการตั้งค่า sql) ลงใน SVN ทำงานเหมือนจับใจ ฉันใช้กับ Unfuddle (ซึ่งทำให้ฉันได้รับการแจ้งเตือนเมื่อเช็คอิน)


6

โซลูชันทั่วไปคือการถ่ายโอนฐานข้อมูลตามความจำเป็นและสำรองไฟล์เหล่านั้น

อาจมีปลั๊กอิน opensource ให้ใช้ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มการพัฒนาของคุณ การกลิ้งรหัสของคุณเองเพื่อทำสิ่งนี้เป็นเรื่องเล็กน้อย

หมายเหตุ: คุณอาจต้องการสำรองฐานข้อมูลดัมพ์แทนการใส่ลงในการควบคุมเวอร์ชัน ไฟล์จะมีขนาดใหญ่ขึ้นอย่างรวดเร็วในการควบคุมเวอร์ชันและทำให้ระบบควบคุมซอร์สทั้งหมดของคุณทำงานช้า (ฉันจำเรื่องราวสยองขวัญ CVS ได้ในขณะนี้)


6

เราเพิ่งเริ่มใช้ Team Foundation Server หากฐานข้อมูลของคุณมีขนาดกลางแล้ว Visual Studio มีการผสานรวมโครงการที่ยอดเยี่ยมด้วยการสร้างแบบเปรียบเทียบการเปรียบเทียบข้อมูลเครื่องมือการฟื้นฟูฐานข้อมูลกรอบการทดสอบฐานข้อมูลและแม้แต่เครื่องมือสร้างข้อมูล

แต่โมเดลนั้นไม่พอดีกับฐานข้อมูลขนาดใหญ่มากหรือบุคคลที่สาม (เข้ารหัสวัตถุ) ได้เป็นอย่างดี ดังนั้นสิ่งที่เราทำคือเก็บเฉพาะวัตถุที่เรากำหนดเอง เซิร์ฟเวอร์พื้นฐานของ Visual Studio / Team ทำงานได้เป็นอย่างดี

หัวหน้าโค้งฐานข้อมูล TFS บล็อก

เว็บไซต์ MS TFS


6

ฉันเห็นด้วยกับคำตอบ ESV และด้วยเหตุผลนั้นฉันเริ่มโครงการเล็ก ๆ สักครู่เพื่อช่วยดูแลการปรับปรุงฐานข้อมูลในไฟล์ที่ง่ายมากซึ่งจะสามารถรักษาซอร์สโค้ดแบบยาวเอาไว้ได้ มันช่วยให้การอัปเดตง่ายสำหรับนักพัฒนาเช่นเดียวกับ UAT และการผลิต เครื่องมือทำงานบน แต่เซิร์ฟเวอร์ sql และ MySql

คุณสมบัติบางประการของโครงการ:

  • อนุญาตให้เปลี่ยนสคีมา
  • อนุญาตค่าประชากรต้นไม้
  • อนุญาตการแทรกข้อมูลการทดสอบแยกต่างหากสำหรับเช่น เอือด
  • อนุญาตให้ตัวเลือกสำหรับการย้อนกลับ (ไม่ใช่อัตโนมัติ)
  • รักษาการสนับสนุนสำหรับเซิร์ฟเวอร์ SQL และ Mysql
  • มีความสามารถในการนำเข้าฐานข้อมูลที่มีอยู่ของคุณลงในการควบคุมเวอร์ชันด้วยคำสั่งง่ายๆ (เซิร์ฟเวอร์ sql เท่านั้น ... ยังคงทำงานบน mysql)

รหัสนี้โฮสต์บนโค้ด google โปรดตรวจสอบรหัส Google สำหรับข้อมูลเพิ่มเติม

http://code.google.com/p/databaseversioncontrol/


5

ไม่นานมานี้ฉันได้พบโมดูล VB bas ที่ใช้วัตถุ DMO และ VSS เพื่อให้ได้ฐานข้อมูลสคริปต์ทั้งหมดและเป็น VSS ฉันเปลี่ยนเป็นสคริปต์ VB และโพสต์ไว้ที่นี่ที่นี่คุณสามารถทำการโทรแบบ VSS และใช้สิ่ง DMO เพื่อสร้างสคริปต์ทั้งหมดแล้วเรียก SVN จากแบตช์ไฟล์เดียวกันที่เรียก VBScript เพื่อตรวจสอบได้

เดฟเจ


5

ฉันยังใช้เวอร์ชันในฐานข้อมูลที่จัดเก็บผ่านทางฐานข้อมูลคุณสมบัติตระกูลของโพรซีเดอร์ แอปพลิเคชันของฉันมีสคริปต์สำหรับแต่ละขั้นตอนเวอร์ชัน (เช่นย้ายจาก 1.1 เป็น 1.2) เมื่อปรับใช้แล้วจะมองไปที่เวอร์ชันปัจจุบันแล้วเรียกใช้สคริปต์ทีละรายการจนกว่าจะถึงเวอร์ชันแอปล่าสุด ไม่มีสคริปต์ที่มีเวอร์ชัน 'สุดท้าย' ตรงแม้กระทั่งปรับใช้บนฐานข้อมูลที่สะอาด แต่จะปรับใช้ผ่านชุดของขั้นตอนการอัพเกรด

ตอนนี้สิ่งที่ฉันต้องการเพิ่มคือฉันได้เห็นการนำเสนอในวิทยาเขต MS สองวันที่ผ่านมาเกี่ยวกับ VS DB รุ่นใหม่และกำลังจะมาถึง งานนำเสนอเน้นเฉพาะในหัวข้อนี้และฉันปลิวไปตามน้ำ คุณควรตรวจสอบอย่างแน่นอนสิ่งอำนวยความสะดวกใหม่เน้นการรักษาคำจำกัดความของสคีมาในสคริปต์ T-SQL (CREATEs), เอ็นจิ้นเดลต้าเดลต้าเพื่อเปรียบเทียบสคีมาการปรับใช้กับสคีมาที่กำหนดไว้ และรวมถึงการรวม MSBUILD อย่างต่อเนื่องสำหรับการสร้างหยดอัตโนมัติ การดรอปจะประกอบด้วยชนิดไฟล์ใหม่ไฟล์. dbschema ที่สามารถนำไปยังไซต์การปรับใช้และเครื่องมือบรรทัดคำสั่งสามารถทำ 'เดลต้า' จริงและเรียกใช้การปรับใช้ ฉันมีรายการบล็อกในหัวข้อนี้พร้อมลิงก์ไปยังการดาวน์โหลด VSDE คุณควรตรวจสอบพวกเขา:http://rusanu.com/2009/05/15/version-control-and-your-database/


5

มันเป็นคำถามที่เก่ามาก แต่หลายคนก็พยายามที่จะแก้ปัญหานี้แม้ตอนนี้ สิ่งที่พวกเขาต้องทำคือการวิจัยเกี่ยวกับโครงการฐานข้อมูล Visual Studio หากปราศจากสิ่งนี้การพัฒนาฐานข้อมูลใด ๆ ตั้งแต่การจัดระเบียบโค้ดไปจนถึงการปรับใช้จนถึงการกำหนดเวอร์ชัน


3

จากประสบการณ์ของฉันการแก้ปัญหาสองเท่า:

  1. คุณต้องจัดการกับการเปลี่ยนแปลงฐานข้อมูลการพัฒนาที่ดำเนินการโดยนักพัฒนาหลายคนในระหว่างการพัฒนา

  2. คุณต้องจัดการกับการอัพเกรดฐานข้อมูลในเว็บไซต์ลูกค้า

เพื่อจัดการ # 1 คุณจะต้องมีเครื่องมือ diff / merge ที่ผสานฐานข้อมูลที่แข็งแกร่ง เครื่องมือที่ดีที่สุดควรสามารถทำการผสานอัตโนมัติให้ได้มากที่สุดในขณะที่ช่วยให้คุณสามารถแก้ไขข้อขัดแย้งที่ไม่ได้จัดการได้ด้วยตนเอง

เครื่องมือที่สมบูรณ์แบบควรจัดการการดำเนินการผสานโดยใช้อัลกอริทึมการผสานแบบ 3 ทิศทางซึ่งจะพิจารณาการเปลี่ยนแปลงที่เกิดขึ้นในฐานข้อมูล THEIRS และฐานข้อมูล MINE ซึ่งสัมพันธ์กับฐานข้อมูล BASE

ฉันเขียนเครื่องมือเชิงพาณิชย์ที่ให้การสนับสนุนการผสานด้วยตนเองสำหรับฐานข้อมูล SQLite และฉันกำลังเพิ่มการสนับสนุนสำหรับอัลกอริทึมการผสาน 3 ทางสำหรับ SQLite ตรวจสอบได้ที่http://www.sqlitecompare.com

เพื่อจัดการ # 2 คุณจะต้องมีเฟรมเวิร์กการอัปเกรด

แนวคิดพื้นฐานคือการพัฒนาเฟรมเวิร์กการอัปเกรดอัตโนมัติที่รู้วิธีอัปเกรดจาก SQL schema ที่มีอยู่ไปเป็น SQL schema ที่ใหม่กว่าและสามารถสร้างเส้นทางการอัพเกรดสำหรับการติดตั้ง DB ที่มีอยู่ทุกตัว

ตรวจสอบบทความของฉันเกี่ยวกับเรื่องในhttp://www.codeproject.com/KB/database/sqlite_upgrade.aspxเพื่อรับแนวคิดทั่วไปเกี่ยวกับสิ่งที่ฉันกำลังพูดถึง

โชคดี

Liron Levi


3

ตรวจสอบ DBGhost http://www.innovartis.co.uk/ ฉันเคยใช้แบบอัตโนมัติมา 2 ปีแล้วและใช้งานได้ดีมาก มันช่วยให้ DB builds ของเราเกิดขึ้นเหมือนกับ Java หรือ C build เกิดขึ้นยกเว้นฐานข้อมูล คุณรู้ว่าฉันหมายถึงอะไร.


2

ฉันขอแนะนำให้ใช้เครื่องมือเปรียบเทียบเพื่อปรับแต่งระบบควบคุมเวอร์ชันสำหรับฐานข้อมูลของคุณ ทางเลือกที่ดีมีxSQL เปรียบเทียบ SchemaและxSQL ข้อมูลเปรียบเทียบ

ตอนนี้หากเป้าหมายของคุณคือมีสกีมาของฐานข้อมูลภายใต้การควบคุมเวอร์ชันคุณสามารถใช้ xSQL Schema เปรียบเทียบเพื่อสร้าง xSQL Snapshots ของ schema และเพิ่มไฟล์เหล่านี้ในการควบคุมเวอร์ชันของคุณ นอกเหนือจากการย้อนกลับหรืออัปเดตเป็นเวอร์ชันเฉพาะให้เปรียบเทียบเวอร์ชันปัจจุบันของฐานข้อมูลกับสแน็ปช็อตสำหรับเวอร์ชันปลายทาง

อนิจจาถ้าคุณต้องการมีข้อมูลภายใต้การควบคุมเวอร์ชันเช่นกันคุณสามารถใช้ xSQL Data Compare เพื่อสร้างสคริปต์การเปลี่ยนแปลงสำหรับฐานข้อมูลของคุณและเพิ่มไฟล์. sql ในการควบคุมเวอร์ชันของคุณ จากนั้นคุณสามารถเรียกใช้สคริปต์เหล่านี้เพื่อเปลี่ยนกลับ / อัปเดตเป็นเวอร์ชันที่คุณต้องการ โปรดทราบว่าสำหรับฟังก์ชั่น 'เปลี่ยนกลับ' คุณต้องสร้างสคริปต์การเปลี่ยนแปลงที่เมื่อดำเนินการแล้วจะทำให้เวอร์ชัน 3 เหมือนกับเวอร์ชัน 2 และสำหรับฟังก์ชัน 'อัปเดต' คุณต้องสร้างสคริปต์การเปลี่ยนแปลงที่ทำตรงกันข้าม

สุดท้ายด้วยทักษะการเขียนโปรแกรมแบบพื้นฐานบางชุดคุณสามารถทำให้กระบวนการทั้งหมดโดยอัตโนมัติโดยใช้รุ่นบรรทัดคำสั่งของ xSQL Schema เปรียบเทียบและเปรียบเทียบข้อมูล xSQL

ข้อจำกัดความรับผิดชอบ: ฉันเข้าร่วมกับ xSQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.