Apakah ada jenis proses "praktik terbaik" untuk diikuti pengembang untuk perubahan basis data?

31

Apa cara yang baik untuk memigrasikan perubahan DB dari Pengembangan ke QA ke lingkungan Produksi? Saat ini kami:

  1. Script perubahan dalam file SQL dan lampirkan ke item kerja TFS.
  2. Pekerjaan ini ditinjau oleh rekan sejawat
  3. Ketika pekerjaan siap untuk pengujian maka SQL dijalankan pada QA.
  4. Pekerjaan diuji QA
  5. Ketika pekerjaan siap untuk produksi maka SQL dijalankan pada basis data produksi.

Masalahnya adalah ini sangat manual. Itu bergantung pada pengembang mengingat untuk melampirkan sql atau peer-reviewer menangkapnya jika pengembang lupa. Kadang-kadang, itu akhirnya menjadi tester atau penyebar QA yang menemukan masalah.

Masalah kedua adalah bahwa Anda terkadang perlu mengoordinasikan perubahan secara manual jika dua tugas terpisah mengubah objek database yang sama. Ini mungkin memang seperti itu tetapi sepertinya masih ada cara otomatis untuk "menandai" masalah ini atau semacamnya.

Pengaturan kami: Toko pengembangan kami penuh dengan pengembang dengan banyak pengalaman DB. Proyek kami sangat berorientasi pada DB. Kami terutama toko .NET dan MS SQL. Saat ini kami menggunakan Item Kerja MS TFS untuk melacak pekerjaan kami. Ini berguna untuk perubahan kode karena ini menghubungkan perubahan ke item pekerjaan sehingga saya bisa mengetahui dengan tepat perubahan apa yang perlu saya sertakan saat bermigrasi ke lingkungan QA dan Produksi. Kami saat ini tidak menggunakan proyek DB tetapi dapat beralih ke yang di masa depan (mungkin itu adalah bagian dari jawabannya).

Saya sangat terbiasa dengan sistem kontrol sumber saya mengurus hal-hal seperti ini untuk saya dan ingin memiliki hal yang sama untuk SQL saya.

Beth Whitezel
sumber
kedengarannya seperti proyek open source yang bagus (jika belum ada)
Patrick
@ Patrick ... ya, tetapi sepertinya akan ada cara untuk melakukan ini dengan semua fungsionalitas MS. Saya ingin OS untuk proyek-proyek rumah juga, tetapi untuk pekerjaan akan menyenangkan untuk tetap dalam lingkungan pengembangan yang kami miliki.
Beth Whitezel
1
Saya pikir proyek basis data bagus untuk ini. Mereka dapat dikendalikan sumber dan skrip perubahan dapat dibuat berdasarkan apa yang ada di sumber.
@ mrskaggs apakah mereka bertindak seperti perubahan kode seperti? Itu menyenangkan jika mereka melakukannya. (dan Anda harus menjawab dengan itu)
Beth Whitezel

Jawaban:

17

Dalam lingkungan VS, saya selalu menggunakan proyek database untuk mengimplementasikan skrip pembaruan. Saya cenderung menggunakan nama yang tidak imajinatif seperti "DatabaseUpdate17.sql" atau "PriceUpdateFebruary2010.sql" untuk skrip saya. Memiliki mereka sebagai proyek basis data memungkinkan saya mengikat mereka ke tugas Server Team, bug (dan jika kita melakukan review kode, juga). Saya juga memasukkan dalam setiap basis data (yang saya punya otoritas atas) sebuah tabel khusus untuk kumpulan perubahan skema.

CREATE TABLE [dbo].[AuditDDL](
    [EventID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
    [EventData] [xml] NULL,                    -- what did they do
    [EventUser] varchar(100) NOT NULL,         -- who did it
    [EventTime] [datetime] DEFAULT (getdate()) -- when did they do it
    )
GO

Nah, itu mengurus 3 dari 6 Ws .

CREATE TRIGGER [trgAuditDDL]
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
INSERT INTO AuditDDL(EventData, EventUser)
SELECT EVENTDATA(), original_login()
GO

Saya menyertakan pernyataan masukkan untuk mencatat awal tambalan dan juga akhir tambalan. Peristiwa yang terjadi di luar tambalan adalah hal yang perlu diperhatikan.

Misalnya, masukkan "mulai tambalan" untuk "tambalan 17" akan terlihat seperti:

INSERT INTO [dbo].[AuditDDL]
           ([EventData]
           ,[EventUser])
     VALUES
           ('<EVENT_INSTANCE><EventType>BEGIN PATCH 17</EventType></EVENT_INSTANCE>'
           ,ORIGINAL_LOGIN())
GO

Karena itu juga menangkap ketika indeks dibangun kembali, Anda harus menjalankan yang berikut ini setiap bulan atau lebih untuk menghapus peristiwa tersebut:

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"ALTER_INDEX")]') =1
GO

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"UPDATE_STATISTICS")]') =1
GO

Versi sebelumnya yang sebelumnya diposting di Server Fault .

Dalam lingkungan yang sesuai dengan SOX dan PCI-DSS, Anda tidak akan pernah memiliki akses ke server produksi. Karena itu skrip harus jelas dan dilaksanakan sebelumnya. Komentar di bagian atas skrip pembaruan mencakup daftar tabel baru, procs tersimpan, fungsi, dll. Serta daftar tabel yang dimodifikasi, procs tersimpan, fungsi, dll. Jika data diubah, jelaskan apa yang sedang dimodifikasi dan mengapa.

Masalah kedua adalah bahwa Anda terkadang perlu mengoordinasikan perubahan secara manual jika dua tugas terpisah mengubah objek database yang sama. Ini mungkin memang seperti itu tetapi sepertinya masih ada cara otomatis untuk "menandai" masalah ini atau semacamnya.

Saya tidak pernah menemukan alat yang memungkinkan kami melacak ini secara otomatis. Majikan sebelumnya menggunakan prinsip "pemilik basis data" - satu dan hanya satu orang yang secara pribadi bertanggung jawab atas database. Orang ini tidak akan menjadi satu-satunya pengembang yang bekerja melawan database itu, tetapi semua perubahan harus melalui mereka. Ini telah bekerja dengan cukup baik untuk mencegah perubahan dari bertabrakan dan merusak satu sama lain.

Tangurena
sumber
Jadi Anda melakukan ini dalam VS dan bukan SSMS kan? Saya mencoba mencari cara terbaik untuk melakukan SCM untuk pekerjaan database saya sekarang, dan kami menggunakan Hg.
jcolebrand
1
@ jcolebrand, ya, saya menggunakan VS untuk menulis dan melacak skrip. Staf produksi menggunakan SSMS untuk menjalankan skrip untuk memperbarui database produksi. Alat basis data di dalam VS cukup baik untuk membandingkan skema. RedGate's SQL Compare adalah alternatif yang layak.
Tangurena
7

Sudahkah Anda melihat Kontrol Sumber SQL? Anda dapat menggunakannya untuk menghubungkan SQL Server Anda ke TFS / SVN / Vault atau VSS - http://www.red-gate.com/products/sql-development/sql-source-control/


sumber
Terima kasih, itu salah satu yang saya telah melihat sedikit. Jika kita tidak suka bagaimana proyek db bekerja di VS maka red-gate terdengar seperti solusi yang bagus.
Beth Whitezel
4

Solusi lain adalah menggunakan sesuatu seperti PowerDesigner, ERWin, dll untuk merancang dan mengelola perubahan pada basis data Anda.

Kami mulai beralih ke kebijakan di mana basis data dimodelkan di PowerDesigner. Semua perubahan pada struktur / kode basis data dilakukan dalam model, diperiksa ke dalam kontrol sumber dan kemudian skrip perubahan dihasilkan dari model untuk mengimplementasikan perubahan dalam basis data. Script perubahan ini juga diperiksa untuk kontrol sumber. Perubahan besar ditinjau oleh rekan kerja dan PowerDesigner membuat ini sangat mudah menggunakan fitur bawaan.

PowerDesigner adalah alat pemodelan generik yang mendukung lebih dari sekadar basis data sehingga kami mulai menggunakannya untuk mengelola persyaratan, membuat diagram konseptual, fisik, dan arsitektur (juga OOM), dll. Pada dasarnya, kami menggunakannya untuk menyediakan tulang punggung bagi kami. proses rekayasa perangkat lunak.

(Saya sama sekali tidak berafiliasi dengan Sybase, yang mengembangkan PowerDesigner - hanya berpikir saya akan melemparkannya ke sana).

ScottCher
sumber
2

DB Ghost

DB Ghost adalah alat favorit saya untuk mengelola basis data.

Manfaat

  1. Semua objek dalam database Anda disimpan sebagai skrip dalam kontrol sumber.
  2. Anda dapat skrip 'data statis' (data tabel pencarian) juga.
  3. Anda dapat memperbarui kontrol sumber secara manual atau dengan membuat skrip database pengembangan 'model'.
  4. Anda dapat membangun basis data (dengan cepat) dari skrip dalam kontrol sumber (termasuk data statis).
  5. Anda dapat menggunakan perubahan untuk instance dari database, termasuk setiap instance produksi:
    • Anda dapat membandingkan 'membangun database' (dibuat dari skrip) dengan database yang ada dan menghasilkan skrip perubahan.
    • Anda dapat mengarahkan DB Ghost untuk menyinkronkan secara otomatis perubahan antara dua instance dari database, mis. Database build dan database produksi Anda.

[4] sangat berguna untuk membuat perubahan lokal atau membuat instance terpisah untuk lingkungan yang berbeda. Sebenarnya sangat mudah bahwa saya membuat database terpisah untuk setiap fitur atau bug yang saya kerjakan yang berdampak pada database.

Detail

Keuntungan utama menggunakannya daripada mempertahankan perubahan eksplisit atau skrip migrasi adalah bahwa Anda sebagian besar tidak perlu mempertahankan skrip perubahan atau migrasi eksplisit - Anda sebagian besar dapat mempertahankan hanya 'versi saat ini' dari database Anda. Salah satu aspek yang mengganggu dalam mengelola skrip migrasi adalah tidak ada cara mudah untuk melihatnya, misalnya daftar kolom dalam sebuah tabel (berdasarkan skrip migrasi). Tentu saja beberapa perubahan perlu dibuat sebagai migrasi eksplisit, tetapi cukup mudah untuk ditangani sebagai skrip terpisah.

Konsekuensi yang sangat bagus untuk dapat mengelola database sebagai (satu set) skrip dan juga dapat dengan cepat membuat contoh baru adalah bahwa unit menguji kode database penting sangat mudah (dan juga cukup menyenangkan). Saya menggunakan tSQLt untuk pengujian unit.

Saya hanya berharap ada alat serupa untuk DBMS-s lainnya.

Kenny Evitt
sumber
1

Saya tahu ini kedengarannya berlebihan bagi kebanyakan DBA:

Sudahkah Anda mempertimbangkan menggunakan Ruby on Rails untuk melacak perubahan Database (dan hanya perubahan DB). Anda tidak perlu menjalankan aplikasi apa pun atau menulis kode ruby, dll. Tapi saya menemukan gaya migrasi (begitulah sebutannya) cukup berguna: http://guides.rubyonrails.org/migrations.html

Sql Server juga didukung, Anda mungkin harus menggunakan JRuby + JDBC.

Sebastian Roth
sumber
belum melihatnya. Terima kasih saya akan memeriksanya.
Beth Whitezel