On my new job I faced a situation where archived tables were created in the production database and now there was a requirement to move them as the database was growing. These archival tables were being used by several jobs and also in the application code. Moving them was demanding and also a very complicated process. I wanted to find a way to minimize the amount of work that the development team had to do, since their time was limited too. Based on the needs and the limited time I wasn't sure what was the best option.
Solution
Fortunately I found a feature in SQL Server 2005 which solved my problems and provided further optimization and facilities. The feature is SYNONYMs in SQL Server 2005. A SYNONYM is new to SQL Server 2005. It is a way to give an alias to an already existing or potential new object. It is just a pointer or reference, so it is not considered to be an object.
In order to create a synonym, you need to have CREATE SYNONYM permissions. If you are a sysadmin or db_owner you will have these privileges or you can grant this permission to other users. Also, you create a synonym that crosses databases you will need permissions for the other database as well..
Here is an example to create the SYNONYM in a database that references another object in the database.
USE AdventureWorks GO
CREATE SYNONYM MySyn FOR Production.Location GO
To check that this works you can issue a query such as below that uses the new SYNONYM.
SELECT * FROM MySyn
Here is an example to create the SYNONYM in one database that references an object in another database.
USE master GO
CREATE SYNONYM dbo.MySyn FOR AdventureWorks.Production.Location GO
To get the meta data for all synonyms use the following command
SELECT * FROM sysobjects WHERE xtype = 'SN' ORDER BY NAME
And to drop the synonym use the following command
USE AdventureWorks; GO
DROP SYNONYM MySyn GO
SYNONYM's can be very useful and can be created for
SYNONYMs provide a layer of abstraction over the referenced object
Allow changes to complicated (multi part) and lengthy names with a simplified alias as a same server resident object.
Provides flexibility for changing the location of objects without changing existing code.
SYNONYMs can be created in the same database to provide backward compatibility for older applications in case of drop or rename of objects.
SYNONYMs can be useful if you give the front-end query tools like spreadsheets and Access linked tables direct links in to the tables.
Limitations
SYNONYMs are loosely bound to the referenced objects. So you can delete a SYNONYM without getting any warning that it is being referenced by any other database object.
Chaining is not allowed. It means that you can not create SYNONYM of a SYNONYM.
Obviously consumes possible object names, as you can not create a table with the same name of a synonym
The object for which the SYNONYM is being created is checked at run time. It is not checked at creation time. So this means that if you make any related error e.g. spelling error, the synonym will created, but you will get an error while accessing the object.
SYNONYM can not be referenced in a DDL statement
Next Steps
Now that you know that you can create a SYNONYM to reference objects in an existing database or another database look for ways that a SYNONYM may be used. Sometimes a simple alias may be the best choice instead of a lot of re-work to move or rename objects.
After some time If I want to implement above script to Database3, Now as a release manager it is difficult(not correct to edit the script) to replace Database1 with DataBase3.
I don’t need dynamic SQL.
whethwe we can use synonym for that?
Monday, September 14, 2015 - 3:21:50 AM - Atif Shehzad
@Jyothi. DBLinks related to inter database objects and their access. While Synonyms are used within or accross the databases with simple purpose that is to use different and simple names for database objects. It may be used to hide the orignal object names or to simplyfy the long object names.
One more limitation, which I just ran into this morning... The SSIS Data Profiling task cannot see synonyms. It only presents tables and views in the object list.
Can you please tell me what is the difference between synonym and dblinks ? both are used to access tables from other databases except the thing that with synonyms we need to grant privileges ??
Connecting the server in SSMS would not be sufficient. You have to create linked server objects to access and then create synonyms for any object in linked server. Also have a look at this tip http://www.mssqltips.com/tip.asp?tip=1820
Is there a way to select a column from, and therefore create a synonym for, a table in a database on another server if both servers are connected in SSMS (SQL Server 2005)? Thanks.
Wednesday, October 6, 2010 - 2:34:36 AM - Atif Shehzad
TimothyAWiseman, thanks for your appreciation. Looking at benifits of synonyms we may say that their usage is far more efficient and benificial than convential usage of views for this purpose.
Wednesday, September 10, 2008 - 10:04:14 PM - @tif
I like to use synonyms for all of my cross database dependencies, it greatly simplifies when you need to move to a new version of a given database. I put some example code up at _this blog post_.