Bagaimana cara menyembunyikan / menonaktifkan tabel tanpa menjatuhkannya untuk memeriksa redundansi?

12

Saya harus memelihara dan memperluas sistem lawas lama yang berisi metode layanan web dan tabel database yang tidak lagi digunakan. Karena saya tidak sepenuhnya yakin bahwa tabelnya benar-benar berlebihan, saya takut untuk menjatuhkannya.

Apakah ada cara lain untuk mencapai efek yang sama (tabel tidak dapat digunakan lagi) tanpa menjatuhkannya? Gagasan saya adalah mentransfernya ke skema yang berbeda (misalnya, Deleted) dari default saat ini dbo,.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

Apakah ada opsi lain atau ada kekurangan pada pendekatan skema?

Tim Schmelter
sumber

Jawaban:

7

Apakah ada cara lain untuk mencapai hal yang sama (tabel tidak dapat digunakan lagi) tanpa menjatuhkannya?

Perubahan skema adalah operasi yang sangat cepat - hanya diperlukan perubahan metadata. Ide asli yang saya dapatkan adalah dari blog Aaron Bertrand - Schema Switch-A-Roo .

Anda dapat mengikuti langkah-langkah dari jawaban saya di sini

Jelas ada metode lain seperti sp_rename N'old table ', N'new table' atau hanya menolak izin ke tabel.

Kin Shah
sumber
Saya tidak yakin jawaban apa yang harus saya terima karena semuanya membantu. Saya tidak tahu artikel Harun, jadi saya sudah menerima ini karena mengandung lebih banyak informasi (meskipun hanya ditautkan).
Tim Schmelter
@TimSchmelter Senang Anda menemukannya bermanfaat. Tidak masuk akal untuk mengulang di sini apa artikel atau jawaban saya (ditautkan). Itulah mengapa saya telah merujuknya.
Kin Shah
12

Beberapa opsi lain hanya mengganti nama tabel, atau jika mereka memiliki indeks berkerumun, Anda dapat menonaktifkan indeks berkerumun.

Chad Mattox
sumber
Terima kasih. Saya tidak tahu bahwa menonaktifkan indeks berkerumun membuat tabel tidak dapat digunakan. Apa pro dan kontra dari pendekatan ini (+ skema)?
Tim Schmelter
5
@TimSchmelter con dari penonaktifan CI adalah untuk mengaktifkannya lagi, Anda perlu membangun kembali indeks. Satu opsi lain adalah menolak izin di atas meja untuk peran publik meskipun pemilik basis data atau admin sistem masih akan melihatnya dan juga mungkin melalui rantai kepemilikan.
Martin Smith
Sebelum menjatuhkan tabel, atau menjatuhkan kolom dari tabel, saya sering mengganti nama dengan menambahkan "_deprecated" atau semacamnya di akhir nama. Maka jika tidak ada kesalahan, pasti tidak ada referensi apa pun.
Jay
Perubahan izin adalah untung-untungan. Jika akun layanan yang menjalankan aplikasi adalah dbo, atau bahkan sysadmin yang lebih buruk maka ia akan sepenuhnya mengabaikan semua jenis DENY. Semoga saja tidak, tetapi itu memang terjadi.
Kenneth Fisher
6

Hapus izin pada tabel dari Peran / Grup / Akun yang [mungkin] akan menggunakannya.

Jika ada yang meledak, pasang kembali [dengan cepat].

Petunjuk: Menggunakan skrip untuk melakukan perubahan ini akan menjadi Ide yang sangat, sangat bagus.

Phill W.
sumber
Seperti halnya pengujian pada basis data non-produksi. ;) Mudah-mudahan, itu jelas bagi OP.
jpmc26
@ jpmc26. saya akan menguji dalam database non-produksi terlebih dahulu. Tetapi masalahnya adalah saya ingin tahu apakah fungsi atau objek basis data digunakan dari luar (tidak hanya melalui metode layanan web tetapi juga langsung pada basis data atau alat admin di lokasi lain perusahaan).
Tim Schmelter
Hm Jika Anda sedang mencari akses DB langsung oleh DBA, sepertinya proses log in sudah beres. Kemungkinan besar Anda tidak akan melihat penggunaan yang sama dalam produk dan non-produk dari pekerjaan manual. Saya tidak begitu yakin betapa mudahnya untuk log operasi ini, tetapi jika Anda memiliki prod login, Anda bisa menganalisisnya untuk mencari penggunaan.
jpmc26
@ jpmc26: tidak apa-apa jika admin itu akan jatuh pada wajah mereka, mereka akan melaporkannya. Tidak oke dengan pelanggan, tetapi itu bisa diperiksa pada sistem pengujian sebelum peluncuran.
Tim Schmelter
3

Menghapus izin pada umumnya tidak akan berhasil karena Anda tidak bisa TERTENTU bahwa seseorang tidak memiliki izin. Mungkin melalui grup, peran atau bahkan karena mereka sysadmin (walaupun mari kita berharap tidak).

Untuk tabel, Anda dapat menonaktifkannya. Dan itu adalah proses yang cepat. Namun untuk mengaktifkannya Anda harus membangunnya kembali dan untuk sebuah meja besar yang bisa memakan waktu cukup lama.

Taruhan terbaik Anda adalah memindahkan objek ke skema baru (seperti yang Anda sarankan) atau memberi nama ulang objek tersebut. Kedua operasi ini cepat dan mudah dilakukan dan dibatalkan. Izin juga akan tetap berlaku di kedua arah.

Langkah tambahan yang dapat Anda ambil adalah menambahkan "catatan TBD" dalam properti yang diperluas dari objek. Anda dapat membuat catatan tentang kapan Anda membuat perubahan, dan / atau catatan apa pun yang mungkin Anda miliki tentang mengapa Anda merasa aman untuk dihilangkan.

Semua yang mengatakan saya akan menjalankan sesi acara yang diperpanjang (atau jejak profiler) selama beberapa hari untuk memastikan Anda memiliki semua objek yang digunakan. Anda dapat sangat membatasi sesi hanya pada nama objek & saat disentuh untuk mengurangi overhead. Pastikan juga Anda menjalankan sesi ini selama beberapa hari di kedua sisi akhir bulan dan bahkan mungkin akhir kuartal untuk memastikan Anda memiliki segalanya.

Kenneth Fisher
sumber
3

Hapus izin seperti yang disarankan Phil W.

Hapus juga izin dari prosedur tersimpan yang menggunakan tabel. Dalam SQL Server, (saya tidak tahu tentang orang lain) izin dirantai dari objek panggilan (misalnya prosedur tersimpan) ke objek yang dipanggil (misalnya tabel).

Peter Bill
sumber
Tugasnya adalah membiarkan semua alat, fungsi, objek, kueri (bahkan dalam basis data jauh) gagal yang mencoba mengakses tabel ini. Jika saya harus memodifikasi prosedur tersimpan saya sudah harus tahu bahwa itu menggunakannya. Atau adakah cara sederhana untuk menentukan bahwa sebuah tabel digunakan oleh prosedur tersimpan?
Tim Schmelter
Saya tidak menyarankan untuk memodifikasi prosedur yang tersimpan, hanya menghapus izin EXECUTE-nya. Seperti yang Anda katakan, mudah untuk mengembalikan izin jika perlu. Anda bisa melihat tabel apa yang digunakan oleh prosedur tersimpan: Di SQL Server Management Studio, Object Explorer, pilih database Anda -> Programmability -> Stored Procedures. Klik kanan pada nama sproc dan pilih Lihat Dependensi. Pilih Objek tempat [nama sproc] bergantung.
Peter Bill