Saya ingin memodifikasi kunci utama yang ada pada tabel SQL Azure.
Saat ini memiliki satu kolom, dan saya ingin menambahkan yang lain.
Sekarang, pada SQL Server 2008 ini adalah sepotong kue, lakukan saja di SSMS, poof. Selesai Ini adalah bagaimana PK terlihat jika saya skrip dari SQL Server:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
Namun, pada SQL Azure, ketika saya mencoba mengeksekusi di atas, tentu saja akan gagal:
Table 'Friend' already has a primary key defined on it.
Baik, jadi saya mencoba untuk menjatuhkan kunci:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Oke, jadi saya mencoba membuat indeks cluster sementara untuk menjatuhkan PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
Yang mengakibatkan:
Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.
Hebat, momen yang menarik.
Bagaimana cara menambahkan kolom UserId ke PK saya yang ada?
sumber
Jawaban:
Catatan: pada Azure SQL Database v12, pembatasan ini tidak lagi berlaku.
Tidak ada yang namanya 'indeks primer'. Ada yang namanya 'kunci utama' dan ada juga yang namanya 'indeks berkerumun'. Konsep yang berbeda, sering membingungkan. Dengan perbedaan ini dalam pikiran, mari kita kembali ke pertanyaan:
T1) Dapatkah indeks berkerumun di tabel SQL Azure diubah?
A: Ya. Gunakan
WITH (DROP_EXISTING=ON)
:T2) Dapatkah indeks berkerumun dari tabel yang memiliki batasan kunci primer diubah?
A: Ya, sama seperti di atas, selama batasan kunci utama tidak ditegakkan melalui indeks berkerumun:
T3) Dapatkah batasan kunci utama dari tabel diubah?
A: Ya, selama kendala utama tidak ditegakkan melalui indeks berkerumun:
T4) Bisakah kunci primer tabel diubah ketika diberlakukan melalui indeks berkerumun?
A: Ya, jika tabel tidak pernah memiliki baris:
T5) Dapatkah kunci utama tabel diubah ketika diberlakukan melalui indeks berkerumun jika tabel diisi?
A: Tidak. Operasi apa pun yang mengubah indeks cluster yang dihuni menjadi heap akan diblokir dalam SQL Azure, bahkan jika tabel kosong :
Sebagai catatan: kendala dapat dimodifikasi jika tabel terpotong .
Solusi untuk mengubah batasan PK dari tabel berpopulasi adalah dengan melakukan
sp_rename
trik lama yang baik :The
sp_rename
pendekatan memiliki beberapa masalah, yang paling penting adalah bahwa hak akses atas meja tidak terbawa selama rename, serta batasan kunci asing.sumber