Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

7 Fakta Tentang Sinonim SQL Server Yang Harus Anda Ketahui

Sebelum SQL Server Synonyms muncul, semua orang ingin menyederhanakan dan meningkatkan pengalaman database mereka.

Bayangkan Anda memiliki aplikasi dengan database yang mereferensikan database lain dari server yang sama. Kemudian, reorganisasi besar-besaran memaksa tim Anda untuk mentransfer database lain ke server lain.

Tidak ada keraguan aplikasi Anda akan rusak. Tapi apa yang akan Anda lakukan dalam kasus itu? Tautkan 2 server dan hardcode semua referensi (lagi) untuk menunjuk ke server baru?

Anda dapat melakukannya jika Anda mau dan lupa jika Anda hanya memiliki beberapa atau selusin referensi tentangnya. Tetapi jika terjadi transfer atau penggantian nama lain, Anda harus mengulangi mimpi buruk yang sama.

Meskipun demikian, ada cara yang lebih baik untuk mengatasi hal ini.

Memperkenalkan Sinonim SQL Server

Sebelum kita menyelami apa yang dapat Anda lakukan dengan Sinonim SQL Server, mari kita jelaskan apa itu.

Sinonim dalam bahasa lisan dan tulisan apa pun mengacu pada kata atau frasa yang memiliki arti yang sama dengan kata atau frasa lain. Jadi, kata cantik adalah sinonim dari indah dan menarik .

Mirip dengan apa yang kita ketahui tentang sinonim kata dan frasa, Sinonim SQL Server merujuk ke nama alternatif dari objek database yang berada di server lokal atau jauh. Baca selengkapnya di sini.

Seperti yang akan Anda lihat dalam fakta berikut, Sinonim SQL Server dapat membuat pemeliharaan aplikasi Anda jauh lebih mudah.

Jadi, mari kita mulai!

1. Sinonim SQL Server Dapat Menyederhanakan Pekerjaan Anda Saat Objek Dasar Ditransfer atau Diganti Nama

Pertama, mereka akan menyelamatkan Anda dari masalah perubahan kode ketika database dipindahkan ke server lain atau diganti namanya karena alasan apa pun. Mari kita lihat skenario yang kami sebutkan di pembukaan postingan ini.

Reorganisasi besar-besaran memaksa tim Anda untuk mengubah referensi ke semua objek di mydatabase2 ke prodserver2.mydatabase2.

Jadi, Anda menanyakan sys.sql_modules dengan semua kemunculan mydatabase2 dari mydatabase1 .

USE mydatabase1
GO
SELECT
 b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO

Sekarang, output dari skrip di atas akan mencantumkan semua objek yang memiliki referensi ke mydatabase2 . Bagus, ya? Dan ini akan membantu menentukan ruang lingkup pekerjaan yang harus dilakukan.

Tapi itu baru permulaan. Anda juga perlu memeriksa apakah ada kode di aplikasi klien Anda atau kode lain yang mereferensikan hal yang sama di luar database Anda.

Jumlah kode yang terpengaruh menunjukkan seberapa besar masalah baru Anda.

Sekarang, berikut beberapa informasi menarik lainnya tentang apa yang terjadi dalam skrip tersebut:

  • sys.sql_modules menyertakan objek SQL yang merupakan modul yang ditentukan SQL seperti tampilan, prosedur tersimpan, fungsi, dll.
  • Nama kolom adalah tempat nama objek berada.
  • Kode SQL untuk objek ada dalam definisi kolom sys.sql_modules .
  • sys.all_objects sertakan semua objek dalam database Anda seperti tabel, tampilan, dll.
  • Kami mengambil type_desc kolom untuk menentukan jenis objek itu (tampilan, prosedur tersimpan, dll.)
  • Di mana klausa memfilter kueri untuk kode SQL apa pun yang menyertakan referensi ke mydatabase2 .
  • Untuk mendapatkan hasil yang memuaskan menggunakan skrip di atas, Anda harus memiliki izin untuk semua objek. Tanyakan kepada Administrator Database Anda atau seseorang dengan peran serupa untuk ini. Anda juga dapat memeriksa ini.

Sekarang setelah Anda mengetahui cara mendapatkan ruang lingkup pekerjaan Anda, sekarang saatnya untuk memperbaikinya.

Cara Memperbaiki Kekacauan Kode Ini Agar Tidak Terjadi Lagi

Baiklah. Saya harus membuat pengakuan.

Menggunakan Sinonim SQL Server hanya akan mengurangi masalah Anda seminimal mungkin, tetapi tidak menghilangkannya.

Sekarang setelah disingkirkan, inilah kabar baiknya:Jika Anda memiliki 10 referensi ke objek jarak jauh sebelum menggunakan sinonim, Anda memodifikasi semua 10. Tapi begitu Anda mulai menggunakan sinonim untuk objek jarak jauh itu, alih-alih memodifikasi 10 kemunculan, kamu hanya mengubah 1. Tidak lebih.

Sekarang, berikut adalah langkah-langkah untuk memperbaikinya menggunakan sinonim:

  1. Buat sinonim untuk setiap objek jarak jauh. Jadi, alih-alih prodserver2.mydatabase2.schema1.object1 Anda dapat merujuknya menggunakan sinonim.
  2. Ubah referensi ke setiap objek menjadi sinonimnya.

Nanti, Anda akan mengetahui secara spesifik bagaimana melakukan ini.

Bawa Pulang:

Sinonim menyediakan lapisan abstraksi untuk melindungi referensi ke objek dasar dari bagian mana pun dari kode Anda, baik di dalam database, aplikasi klien, atau di mana pun. Jadi, Anda bisa bersukacita saat terjadi perubahan lain, baik itu transfer objek atau rename.

2. Anda Dapat Membuat Sinonim SQL Server untuk Sebagian Besar Objek

Selanjutnya, mari kita cari tahu objek apa yang bisa memiliki sinonim?

  • Tabel
  • Tampilan
  • Prosedur Tersimpan
  • Fungsi

Sekarang setelah Anda mengetahui jenis objek, Anda mungkin memiliki gagasan tentang apa yang dapat Anda lakukan dengan sinonim. Mari kita lebih spesifik.

3. Anda Dapat Mengeluarkan Perintah yang Sesuai untuk Sinonim Objek

Ketiga, berikut adalah beberapa perintah khusus untuk setiap jenis objek.

Tabel

Sebanyak yang Anda bisa lakukan SELECT, INSERT, UPDATE, dan DELETE ke tabel, Anda bisa melakukan hal yang sama untuk sinonimnya.

Jadi, alih-alih:

SELECT * FROM prodserver2.mydatabase2.schema1.table1

Anda dapat memiliki versi yang lebih pendek yang tahan terhadap perubahan berikutnya:

SELECT * FROM synonym1

Karena ini masalahnya, Anda juga dapat melakukan ini:

UPDATE synonym1
SET column1 = <value>

Dan hal yang sama berlaku untuk INSERT dan DELETE.

Namun, harap perhatikan hal berikut:

  • Memasukkan record baru melalui sinonim akan menambahkan record baru ke tabel dasar. Dalam kasus kami, prodserver2.mydatabase2.schema1.table1 .
  • Memperbarui dan menghapus akan memiliki efek yang sama.

Sejauh ini, kami hanya menampilkan perintah DML. Bagaimana dengan perintah DDL seperti DROP?

Sayangnya, Anda tidak dapat melakukannya. Inilah alasannya:

Menjatuhkan sinonim tidak akan menjatuhkan tabel dasar. Ini akan menjatuhkan sinonim. Saya akan membahas ini secara mendetail sebentar lagi.

Tapi inilah satu hal lagi yang dapat Anda lakukan untuk SQL Server Sinonim tabel:BERGABUNG.

Seberapa nyaman ini? Alih-alih mengeluarkan ini:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id

Anda dapat melakukan ini:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id

Apakah itu lebih sederhana? Tentu saja!

Prosedur Tersimpan

Satu perintah relevan yang dapat Anda lakukan dengan sinonim dari prosedur tersimpan adalah EXEC.

Jadi, alih-alih menjalankan prosedur jarak jauh seperti ini:

EXEC prodserver2.mydatabase2.schema1.spProcedure1

Anda dapat membuat sinonim untuk prosedur di atas. Sebut saja synProcedure1 . Dan panggil dengan cara ini:

EXEC synProcedure1

Haruskah kita melanjutkan? Anda dapat melakukan banyak hal yang sama dengan VIEWs dan FUNCTIONs. Tentu saja, jika Anda memiliki izin yang diperlukan. Tapi pertama-tama, mari kita bahas cara membuat Sinonim SQL Server.

4. Anda Dapat Memulai Pencarian Anda dengan Sinonim SQL Server Dengan CREATE

Kami telah mencapai titik bagaimana Anda dapat membuat sinonim. Inilah cara kita melakukannya menggunakan T-SQL untuk sebuah tabel:

CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Tapi perhatikan peringatan ini:

Memeriksa keberadaan dan izin untuk mydatabase2.schema1.table1 di prodserver2 ditangguhkan hingga waktu proses.

Itu berarti Anda tidak akan tahu jika:

  • 2 server (prodserver1 dan prodserver2 ) sudah ditautkan.
  • database mydatabase2 , skema schema1 , dan tabel tabel1 benar-benar ada.
  • akses Anda ke sumber daya tersebut diizinkan.

Jadi, setelah membuat sinonim, uji dengan menjalankan perintah yang Anda harapkan berfungsi.

Dan dengan prosedur, tampilan, dan fungsi tersimpan, Anda harus bertindak dengan cara yang sama.

Tapi itu tidak semua. Jika kita dapat membuat sinonim, kita juga dapat menghapusnya menggunakan:

DROP SYNONYM synonym1

Dan inilah peringatan lain:Karena Anda dapat menghapus sinonim kapan saja, referensi ke sinonim yang dihapus hanya akan diperiksa saat runtime.

Jadi sebelum menjatuhkan sinonim, periksa sys.sql_modules karena jika ada referensi untuk itu.

Menggunakan SQL Server Management Studio (SSMS) untuk Membuat dan Menghapus Sinonim

Sejauh ini, kami telah menggunakan T-SQL untuk membuat dan menghapus Sinonim SQL Server. Anda mungkin lebih suka menggunakan antarmuka grafis saat melakukan hal yang sama.

Ayo kita mulai bermain.

Membuat Sinonim

Jika Anda tidak suka mengetik perintah, berikut adalah langkah-langkah yang harus diikuti dalam membuat sinonim:

  1. Jalankan SSMS dan login ke SQL Server Anda.
  2. Cari database tempat Anda ingin membuat sinonim.
  3. Perluas.
  4. Klik kanan Sinonim folder dan pilih Sinonim Baru .
  5. Isi formulir dengan informasi yang diperlukan untuk sinonim, termasuk nama, skema, dll.
  6. Klik Oke .

Di bawah ini adalah tangkapan layar formulir di SSMS:

Menghilangkan Sinonim

Berbicara tentang preferensi, mengetik perintah untuk membuat sinonim adalah hal yang saya sukai. Tetapi menjatuhkannya sesuka hati lebih sederhana daripada mengetik perintah. Tentu saja, itu hanya kesukaanku. Bagaimanapun, di bawah ini adalah langkah-langkah yang harus diikuti ketika menjatuhkan sinonim:

  1. Jalankan SSMS dan login ke SQL Server Anda.
  2. Cari database tempat sinonim yang ingin Anda hapus berada.
  3. Perluas.
  4. Luaskan Sinonim map.
  5. Cari sinonim yang ingin Anda hapus.
  6. Klik kanan sinonim yang ingin Anda hapus dan pilih Hapus .
  7. Klik Oke .

Untuk meringkas langkah-langkah di atas, cukup klik kanan sinonim untuk melepaskan, lalu pilih Hapus dan terakhir, klik OK .

Di bawah ini adalah tangkapan layar dari jendela yang akan muncul sebelum mengonfirmasi penghapusan:

5. Anda Dapat Mengamankan Sinonim SQL Server

Menggunakan GRANT, DENY, atau REVOKE, Anda dapat mengontrol akses ke sinonim.

Untuk MEMBERIKAN izin PILIH ke sinonim sinonim1 ke pengguna bernama penguji , Anda lakukan sebagai berikut:

GRANT SELECT ON synonym1 to testuser

Izin lain yang dapat Anda tambahkan atau hapus dari sinonim adalah sebagai berikut:

  • KONTROL
  • JALANKAN
  • PERBARUI
  • MASUKKAN
  • HAPUS
  • LIHAT DEFINISI
  • Ambil KEPEMILIKAN

6. Tidak Dapat Menemukan Tabel, Tampilan, atau Prosedur Itu? Ini Mungkin Sinonim

Salah satu masalah yang mungkin dialami oleh pendatang baru di tim Anda adalah tabel, tampilan, prosedur, atau fungsi yang "hilang". Tentu saja, jika SELECT dikeluarkan pada suatu objek, itu mungkin tabel atau tampilan. Tetapi dia tidak dapat menemukannya di daftar tabel atau daftar tampilan. Dan jika dia tidak menggunakan Sinonim SQL Server sebelumnya, itu masalah tambahan.

Kurangnya orientasi, kesenjangan dalam dokumentasi, atau kesenjangan dalam standar Anda dapat ditertibkan. Berikut skrip bagus yang akan membantu Anda menyajikan daftar sinonim dan objek dasarnya kepada anggota tim baru Anda:

SELECT
 a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on 
           CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type

Objek yang "hilang"? Tidak lagi jika itu sinonim.

Namun sebelum Anda bersemangat menjalankan skrip ini, berikut beberapa hal yang harus Anda pertimbangkan:

  • sys.synonyms adalah tempat semua Sinonim SQL Server didefinisikan dalam database saat ini.
  • Kami mengambil jenis dan jenis deskripsi (jenis dan type_desc masing-masing) di sys.all_objects . Jika Anda memiliki ide yang lebih baik selain bergabung dengan mereka dengan subkueri, beri tahu saya.
  • OBJECTPROPERTYEX digunakan untuk mendapatkan tipe objek dasar apakah itu tabel, prosedur tersimpan, atau lainnya.
  • Terakhir, jika Anda tidak memiliki izin minimum yang diperlukan untuk menjalankan skrip ini dan mendapatkan hasil yang diinginkan, saatnya berteman dengan DBA Anda atau seseorang dengan peran serupa :)

Tetapi Anda mungkin bertanya-tanya, mengapa melakukan semua ini jika tidak bekerja dengan baik?

7. Akankah Sinonim SQL Server Mempengaruhi Kinerja?

Ini adalah keprihatinan bersama. Dan untuk menyempurnakan apa yang terjadi di balik layar, mari kita lihat ringkasan dari apa yang akan terjadi dalam rencana eksekusi:

  1. Saat mengeksekusi kode paling sederhana dengan sinonim (misalnya SELECT * from synonym1), SQL Server akan memasuki fase binding di mana objek dasar akan menggantikan sinonim.
  2. Selanjutnya, apa pun rencana pengoptimalan terbaik yang ada untuk mengeksekusi perintah ke objek dasar, itu akan sama.

Berikut beberapa pertanyaan dan jawaban mengenai 2 pernyataan di atas:

  1. Berapa lama SQL Server melakukan fase binding? JAWABAN:Tidak butuh waktu lama. Biasanya terjadi dalam sekejap.
  2. Jika langkah selanjutnya menggunakan rencana pengoptimalan terbaik yang sama dengan objek dasar, dan kueri ke objek dasar "cukup cepat", apakah akan lebih lambat? JAWABAN:Tidak, karena akan menggunakan rencana eksekusi yang sama.
  3. Bagaimana dengan otentikasi dari server baru? JAWABAN:Jika ada sedikit keterlambatan yang disebabkan oleh transfer database ke server baru, itu bukan disebabkan oleh sinonim. Performa kueri untuk memanggilnya menggunakan sinonim atau hardcoding server.database.schema.object harus sama karena sinonim hanyalah nama alternatif untuk objek dasar. Selesaikan kinerja lambat dari objek dasar.

Tapi jangan mengambil kata-kata saya untuk itu. Anda harus memeriksanya sendiri dengan rencana eksekusi kueri dan kinerja aktual Anda.

Kesimpulan

Secara keseluruhan, kami membahas cukup banyak informasi tentang Sinonim SQL Server, jadi mari kita rekap.

Pertama, sinonim hanyalah nama alternatif yang akan menyelamatkan Anda dari perubahan dan transfer nama objek. Kedua, kandidat yang baik untuk sinonim adalah tabel, tampilan, prosedur tersimpan, dan fungsi. Selanjutnya, Anda dapat melakukan perintah yang sesuai dengan objek dasarnya dari sinonim. Anda juga bisa mengamankannya. Kemudian, jika Anda perlu melihat daftar sinonim, Anda memiliki sys.synonyms untuk membantumu. Terakhir, performa seharusnya tidak menjadi masalah jika tidak ada masalah performa dengan objek dasar.

Jadi mengapa tidak mencobanya hari ini?

Bagaimana menurutmu? Beri tahu kami di komentar.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DevOps:DBA atau Pengembang – Mendapatkan Keseimbangan dengan Benar

  2. SQL Server 2008 Spatial:temukan titik dalam poligon

  3. VALUES Clause di SQL Server

  4. Bagaimana saya bisa MEMILIH beberapa kolom dalam CASE WHEN di SQL Server?

  5. Sesi dan Status Aktif SQL Server