Cara terbaik untuk mengubah nama tabel setelah pengembangan selesai

8

Apa pendekatan termudah dan paling dapat diandalkan untuk mengubah nama tabel dan kolom database di SQL Server 2008 r2? Kami telah menyelesaikan pengembangan dan untuk beberapa alasan, kami diminta untuk mengganti nama beberapa tabel dan beberapa kolom baru.

Apakah menggunakan sinonim cara yang baik untuk melakukan itu? Apa jebakan yang harus kita siapkan? Apakah itu membantu mengganti nama kolom dengan anggun juga?

Kami memiliki banyak skrip yang terkait dengan tabel ini dan juga dirujuk dalam aplikasi oleh pengembang .net.

Langit
sumber
Apakah niat untuk mengubah nama objek database ini dan memberikan tampilan depan sehingga aplikasi yang ada tidak perlu dimodifikasi untuk menggunakan nama objek yang baru?
billinkc

Jawaban:

10

Saya pikir pendekatannya tergantung pada apakah aplikasi itu aktif atau jika Anda masih menguji.

Untuk tabel, pendekatan teraman adalah membuat sinonim menggunakan nama baru. Dengan cara ini Anda dapat mengubah aplikasi satu per satu (atau bahkan satu referensi pada satu waktu), tanpa harus mengubah semuanya sekaligus. Anda tidak harus meninggalkan sinonim dan mengganti nama tabel sampai Anda yakin Anda memiliki semua perubahan di tempatnya.

CREATE SYNONYM dbo.NewName FOR dbo.OldName;
-- change app to point to dbo.NewName;

-- once all of your changes have been tested:
BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
COMMIT TRANSACTION;

Untuk kolom, ini sedikit rumit. Anda dapat membuat sinonim yang mengarah ke tampilan, tetapi tidak semua tampilan harus dapat diupdate tergantung pada tabel dasar. Sebagai contoh sederhana:

CREATE VIEW dbo.vNewName 
AS 
  SELECT Column1, NewColumnName = OldColumnName
    FROM dbo.OldName;

CREATE SYNONYM dbo.NewName FOR dbo.vNewName;

Kemudian seperti di atas, ketika Anda telah mengubah semua referensi ke kolom dan nama tabel baru, cukup:

BEGIN TRANSACTION;
  DROP SYNONYM dbo.NewName;
  DROP VIEW dbo.vNewName;
  EXEC sp_rename N'dbo.OldName', N'NewName', N'OBJECT';
  EXEC sp_rename N'dbo.NewName.OldColumnName', N'NewColumnName', N'COLUMN';
COMMIT TRANSACTION;

Jika aplikasi tidak aktif dan masih melalui pengujian, cukup ganti nama kolom dan perbaiki kerusakan apa yang terjadi setelah pencarian global dan ganti (atau refactor pintar menggunakan SSDT, RedGate, dll.) Melalui kode / prosedur aplikasi dll.

Jika aplikasi ini aktif, Anda perlu melangkah sedikit lebih hati-hati.

Aaron Bertrand
sumber
+1 untuk memvalidasi perubahan itu dan memperbaiki pendekatan apa yang saya dapatkan dari tim saya sendiri (tentu saja hanya untuk enviro)
RThomas
Terima kasih atas jawaban Anda yang baik, tetapi apakah Anda dapat memberi tahu saya apa yang Anda maksud dengan: "Dengan cara ini Anda dapat mengubah aplikasi satu per satu (atau bahkan satu referensi pada satu waktu), tanpa harus mengubah semua mereka sekaligus. " Maksud Anda, kita harus membuat sinonim satu per satu misalnya tabel pertama t1, apakah kode berubah, lalu tabel t2, dll?
Langit
Kita sekarang berada pada tahap pengembangan, tetapi sistem hampir selesai untuk komponen yang akan diubah namanya. Sistem sekarang digunakan untuk UAT.
Langit
1
@Nazila tidak, maksud saya bahwa Anda dapat membuat sinonim untuk table1 (dan satu untuk table2, table3, dll.). Kemudian Anda dapat mengubah satu aplikasi, atau satu kelas, atau satu modul, atau satu prosedur tersimpan untuk menggunakan nama baru melalui sinonim. Sisa kode dapat terus menggunakan nama lama. Anda tidak akan menghapus sinonim dan mengganti nama sampai semua kode diperbarui.
Aaron Bertrand
0

Ada banyak jebakan yang bisa Anda temui saat mengubah nama tabel dan kolom. SQL atau kode aplikasi lain apa pun yang memanggil mereka harus diganti namanya agar cocok atau tidak akan berfungsi. Redgate membuat beberapa alat yang cukup bagus yang dapat melewati dan membuat semua perubahan pada SQL veiws / functions / sprocs. Saran terbesar yang bisa saya berikan kepada Anda adalah melakukan perubahan ini di lingkungan DEV terlebih dahulu dan TEST TEST TEST untuk memastikan Anda telah memperbaiki kode di mana-mana.

Zane
sumber