Sinonim dalam SQL Server adalah objek database yang memberikan nama alternatif untuk objek database yang ada secara lokal atau di server jauh. Selain itu, mereka menyediakan lapisan abstraksi untuk melindungi aplikasi dari perubahan apa pun pada objek dasar.
Dalam skrip T-SQL, kami menggunakan nama 3 bagian untuk referensi objek database. Formatnya adalah:
[Database].[Skema].[Objek]
Misalnya, kita memiliki infrastruktur database berikut:
- Nama Basis Data:[Azuredemodatabase]
- Skema:[SalesLT]
- Objek(nama tabel):Produk
Pernyataan SELECT dengan nama 3 bagian adalah sebagai berikut:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
Demikian pula, server jauh menggunakan konvensi penamaan 4 bagian. Bagian tambahannya adalah [nama server jarak jauh]. Oleh karena itu, formatnya akan menjadi
[Nama Server].[Database].[Skema].[Objek].
Bayangkan Anda perlu mengganti nama [SalesLT].[Product] tabel untuk [Data Produk] .
Tabel ini direferensikan dalam beberapa prosedur, fungsi, dan tampilan tersimpan. Oleh karena itu, Anda perlu memodifikasi semua referensi tersebut dalam kueri atau aplikasi klien untuk menggunakan nama tabel terbaru.
Anda dapat membuat Sinonim yang mereferensikan objek database dan menggunakannya dalam kueri SQL Anda. Jika ada perubahan yang terjadi, Anda hanya perlu membuat ulang definisi Sinonim. Anda tidak perlu mengubah referensi objek apa pun dalam kueri karena kami menggunakan Sinonim.
Dalam kasus yang berbeda, kami membuat sinonim yang menunjuk ke tabel [Azuredemodatabase].[SalesLT].[Product]. Kemudian, kami menjatuhkan tabel dan membuat tampilan dengan nama yang mirip. Dalam hal ini, Sinonim akan secara otomatis mereferensikan tampilan karena pengikatan objek terjadi dengan nama objek.
Jika Anda memindahkan objek ke database yang berbeda, Sinonim membantu Anda meminimalkan upaya saat membuat perubahan. Setelah Anda membuat ulang Sinonim, semua kueri SQL secara otomatis mendapatkan lokasi objek terbaru.
Anda juga dapat menggunakan Sinonim untuk menyembunyikan nama objek database. Pengguna dapat meminta Sinonim untuk mengambil hasil alih-alih menanyakan tabel dasar.
Anda dapat menentukan Sinonim di SQL Server untuk objek berikut:
- Tabel yang ditentukan pengguna
- Prosedur tersimpan
- Lihat
- Fungsi bernilai tabel skalar dan sebaris
- Tabel sementara lokal dan global
- Prosedur tersimpan CLR , fungsi (nilai tabel, agregat, skalar)
Catatan:Nama sinonim harus unik dalam database.
Di mana Menggunakan Sinonim di SQL Server
Kita dapat menggunakan Sinonim dalam pernyataan T-SQL, seperti Select, Update, Execute, Insert, Delete, dan sub-queries.
Namun, kami tidak dapat menggunakan Sinonim dalam pernyataan bahasa definisi data (DDL) seperti Buat dan Ubah. Selain itu, Sinonim tidak cocok untuk Periksa batasan, kolom yang dihitung, ekspresi default, Ekspresi aturan, tampilan terikat skema, dan fungsi.
Buat Sinonim di SQL Server di Server Lokal
Untuk membuat Sinonim di SQL Server, kami menggunakan pernyataan CREATE SYNONYM. Sintaksnya adalah sebagai berikut:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Misalnya, mari kita buat sinonim [MyProductCatalog] untuk [Azuredemodatabase].[SalesLT].[Produk] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
Setelah dibuat, Anda dapat mengganti nama tabel dengan Sinonim seperti yang ditunjukkan di bawah ini. Ini secara internal mereferensikan tabel dasar yang kami rujuk dalam pernyataan CREATE SYNONYM.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Buat Sinonim dalam Database di Server Jarak Jauh
Misalkan objek ada di server jauh [ABC]. Anda dapat membuat Sinonim untuk menghindari menentukan nama 4 bagian dalam kueri. Dalam kueri di bawah ini, objek dasarnya ada di [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Membuat Sinonim dengan SQL Server Management Studio
Untuk membuat Sinonim, kita dapat menggunakan GUI SQL Server Management Studio.
- Hubungkan ke instance SQL Anda, perluas database, dan navigasikan ke folder Synonyms.
- Klik kanan padanya dan pilih Sinonim Baru.
- Masukkan detail yang diperlukan untuk Nama Sinonim, Skema Sinonim, Nama Basis Data, Skema Objek, Jenis Objek, dan Nama.
Dalam contoh kami, kami membuat Sinonim dalam skema [Sumber Daya Manusia], sama seperti skema tabel:
Klik Skrip untuk mendapatkan skrip T-SQL yang setara seperti di bawah ini:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Sinonim untuk Fungsi yang Ditentukan Pengguna
Pertama, buat UDF dbo.TestSynonym menggunakan skrip di bawah ini:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
Kemudian, buat sinonimnya dengan nama dbo.UDFTest . Anda dapat memanggil UDF menggunakan Sinonim dan mengambil hasil kueri:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Perbarui Pernyataan dan Sinonim
Misalkan Anda ingin memperbarui nilai dalam tabel SQL. Jika Anda telah mendefinisikan Sinonim di dalamnya, Anda juga dapat menggunakannya. Misalnya, pernyataan pembaruan di bawah ini menggunakan Synonym [Perofmancetest] sebagai ganti nama tabel SQL:
Update performancetest set [Name]='Updated New value' where ID=1
Meninggalkan Sinonim
Anda dapat menggunakan pernyataan DROP SYNONYM untuk menghapus sinonim tertentu dalam database. Kueri di bawah menghapus [EmpData ] di AdventureWorks2017 basis data:
Use AdventureWorks2017
Drop Synonym EmpData
Mendapatkan Daftar Sinonim Basis Data di SQL Server
Asumsikan Anda ingin mengetahui sinonim yang ada dalam database bersama dengan objek dasarnya. Anda dapat menanyakan sys.synonyms tampilan katalog sistem di database masing-masing:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
Dalam output kueri, Anda mendapatkan informasi berikut:
- Nama sinonim
- Objek dasar (nama objek 3 bagian atau 4 bagian)
- Jenis objek ( SN =Sinonim)
Bagaimana jika kita Memodifikasi Objek Dasar Sinonim?
Mari kita pertimbangkan dampak dari memodifikasi objek dasar dari sinonim. Kami memiliki kueri untuk melakukan beberapa tugas:
- Buat sinonim (nama Sinonimnya adalah [dbo].[EmpData] untuk Objek Dasar [AdventureWorks2017].[DBO].[Emp] )
- Lepaskan objek dasar (tabel) [AdventureWorks2017].[DBO].[Emp]
- Buat tampilan dengan nama [DBO].[Emp] di database [AdventureWorks2017].
USE [AdventureWorks2017]
GO
CREATE SYNONYM [dbo].[EmpData] FOR [AdventureWorks2017].[DBO].[Emp]
GO
Drop table [AdventureWorks2017].[DBO].[Emp]
Go
Create view [DBO].[Emp]
as
Select * from dbo.Employee
go
Seperti disebutkan sebelumnya, Sinonim mengikat objek menggunakan namanya. Jadi, itu harus menunjukkan ke tampilan alih-alih tabel. Dalam hal ini, tabel [dbo].[Emp] tidak ada.
Seperti yang ditunjukkan di bawah ini, itu adalah tampilan di [AdventureWorks2017] basis data.
Atau, Anda dapat menggunakan OBJECTPROPERTYEX() untuk memeriksa jenis dasar objek sinonim:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Di sini, referensi tipe Base ke tampilan database. Dalam kasus tabel SQL, Anda mendapatkan U dalam keluaran.
Apakah Sinonim Mempengaruhi Kinerja Kueri Secara Negatif?
Banyak profesional database memilih untuk tidak menggunakan sinonim di SQL Server. Maksud mereka adalah bahwa SQL Server harus melakukan langkah tambahan dalam menyelesaikan tabel dasar dari Sinonim. Dengan demikian, itu mungkin menghasilkan efek negatif.
Mari kita uji kinerja kueri. Kami mengambil catatan dari nama tabel dan Sinonim:
Create table TestTable
(
ID int,
[Name] varchar(20)
)
Insert into TestTable values (1, 'Temporary Data')
GO 10000
Create synonym performancetest for TestTable
SET STATISTICS IO ON;
Select * from TestTable
Go
Select * from performancetest
Pertama, mari kita periksa rencana eksekusi yang sebenarnya. Kedua kumpulan kueri memiliki rencana eksekusi dan biaya operator yang sama:
Demikian pula, kedua kueri memiliki 41 pembacaan logis dan satu jumlah pemindaian untuk mengambil keluaran yang diinginkan.
SQL Server menyelesaikan nama objek dasar sinonim dalam fase pengikatan eksekusi kueri. Ini terjadi sebelum fase optimasi kueri. Oleh karena itu, Anda melihat rencana eksekusi yang serupa dan tidak ada dampak kinerja. Akibatnya, Anda dapat menggunakan sinonim untuk menghindari nama 3 bagian atau 4 bagian yang panjang untuk objek yang sering diakses. Ini tidak memengaruhi kinerja kueri.
Itu tidak berarti Anda membuat Sinonim untuk setiap objek seperti tabel, prosedur tersimpan, fungsi, tampilan. Anda dapat menggunakannya untuk objek yang paling sering diakses untuk referensi cepat dalam kueri.
Kesimpulan
Sinonim dalam SQL Server dapat bermanfaat. Mereka menyederhanakan nama objek database dengan menghindari nama panjang 3 bagian atau 4 bagian. Anda dapat menggunakannya untuk mereferensikan objek lokal dan jarak jauh. Itu tidak menghasilkan masalah kinerja. Oleh karena itu, Anda dapat menjelajahi menggunakannya untuk fleksibilitas dalam menulis kueri. Namun, yang terbaik dari semuanya adalah mendefinisikan sinonim hanya untuk objek yang sering digunakan dalam skrip SQL.