آموزش کامل دستور CREATE SYNONYM در SQL Server
معرفی و هدف مقاله
دستور CREATE SYNONYM از مباحث مهم طراحی و نگهداری سامانههای مبتنی بر Microsoft SQL Server است. این مقاله موضوع CREATE SYNONYM را از تعریف اولیه تا کاربرد حرفهای، خطاهای رایج، رفتار با NULL، Unicode، Collation، Index و Execution Plan بررسی میکند.
CREATE SYNONYM یک نام محلی در Schema برای ارجاع به شیء پایه در همان Database، Database دیگر یا Linked Server ایجاد میکند. هدف فقط حفظ کردن Syntax نیست؛ باید بدانید دستور یا شیء مورد نظر در چه زمانی انتخاب درستی است، چه مجوزی میخواهد، چه وابستگیهایی دارد و چگونه نتیجه آن را کنترل میکنید.
همه مثالها با نام Schema صریح نوشته شدهاند. هرجا داده فارسی وارد میشود از نوع nvarchar و Literal دارای پیشوند N استفاده شده است. قبل از اجرای نمونههای مخرب، نام Server و Database، Backup و امکان Rollback را بررسی کنید.
| ویژگی | مقدار | توضیح |
|---|
| موضوع | CREATE SYNONYM | دستور CREATE SYNONYM |
| دستهبندی | انتزاع نام اشیا | مخصوص Microsoft SQL Server |
| نسخه | SQL Server 2005 و نسخههای جدیدتر | گزینههای خاص باید با نسخه موتور کنترل شوند |
| سطح | مبتدی تا حرفهای | شامل Syntax، مثال، کارایی و امنیت |
| زمان مطالعه | ۱۵ تا ۲۰ دقیقه | با اجرای تمرینها زمان بیشتری لازم است |
| پیشنیاز | آشنایی مقدماتی با T-SQL | برای ساخت CREATE SYNONYM و ALTER روی Schema؛ برای استفاده نیز مجوز شیء پایه لازم است. |
تعریف، دستهبندی و نحوه عملکرد
CREATE SYNONYM یک نام محلی در Schema برای ارجاع به شیء پایه در همان Database، Database دیگر یا Linked Server ایجاد میکند. این قابلیت در دسته «انتزاع نام اشیا» قرار میگیرد و نتیجه آن از طریق Catalog Viewها، DMVها یا Queryهای کنترلی قابل مشاهده است.
در SQL Server بسیاری از دستورات DDL مقدار بازگشتی شبیه تابع Scalar ندارند. موفقیت باید با نبود خطا، مشاهده Metadata جدید، آزمون رفتار داده و کنترل مصرفکنندگان اثبات شود. در محیط حرفهای این کنترل بخشی از Migration Script است.
Syntax اصلی
CREATE SYNONYM schema_name.synonym_name
FOR [server_name.[database_name].[schema_name].]object_name;
اجزای مهم Syntax
- نام Schema را صریح بنویسید تا Default Schema کاربر نتیجه را تغییر ندهد.
- برای نام شیء، Index و Constraint استاندارد ثابت و قابل جستجو انتخاب کنید.
- گزینههای Online، Resumable، Cache، Cycle یا Cascade را فقط بعد از بررسی نسخه و ریسک فعال کنید.
- در Dynamic SQL نام اشیا را فقط از Whitelist بگیرید و با QUOTENAME ایمن کنید.
نسخههای پشتیبانیشده و مجوزها
SQL Server 2005 و نسخههای جدیدتر پیش از استقرار، نسخه دقیق موتور و Compatibility Level را بررسی کنید. ممکن است یک Syntax در SQL Server محلی، Azure SQL Database یا Managed Instance رفتار و محدودیت متفاوتی داشته باشد.
برای ساخت CREATE SYNONYM و ALTER روی Schema؛ برای استفاده نیز مجوز شیء پایه لازم است. اعطای db_owner یا sysadmin برای حل سریع خطای مجوز روش مناسبی نیست. بهتر است Role اختصاصی بسازید و فقط Permission لازم را به حساب استقرار یا اپلیکیشن بدهید.
SELECT @@VERSION AS SqlServerVersion;
SELECT DB_NAME() AS DatabaseName,
compatibility_level,
collation_name
FROM sys.databases
WHERE database_id = DB_ID();
چه زمانی استفاده کنیم و چه زمانی استفاده نکنیم
زمان مناسب
وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند. زمانی از CREATE SYNONYM استفاده کنید که نیاز واقعی، وابستگیها، حجم داده و پنجره نگهداری مشخص شده باشند و معیار موفقیت قابل اندازهگیری وجود داشته باشد.
زمان نامناسب
اگر هدف فقط پنهان کردن طراحی ضعیف، دور زدن Constraint، رفع موقت کندی یا حذف پیام خطا است، ابتدا علت ریشهای را پیدا کنید. تغییر ساختار بدون تحلیل ممکن است مشکل را از یک Query به کل سامانه منتقل کند.
هر تغییر خوب باید قابل تکرار، قابل ممیزی، قابل بازگشت و در Source Control ثبتشده باشد.
مثال عملی اول
CREATE SYNONYM dbo.CustomerSource
FOR SalesDb.dbo.Customers;
پس از اجرا فقط به پیام Commands completed successfully اکتفا نکنید. Metadata، تعداد ردیف، Constraint معتبر، تعریف View یا وضعیت Index را با Query مستقل کنترل کنید و نتیجه را با انتظار کسبوکار مقایسه نمایید.
مثال عملی دوم روی سناریوی واقعی
CREATE SYNONYM reporting.MonthlySalesProcedure
FOR AnalyticsDb.reporting.uspBuildMonthlySales;
نام جدول، مسیر فایل، مقدارها و گزینههای این نمونه آموزشی هستند. در Production باید آنها را با محیط واقعی جایگزین و اثر Lock، Transaction Log، tempdb، Replication و Availability Group را ارزیابی کنید.
نتیجه نمونه و روش کنترل
وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند. برای کنترل CREATE SYNONYM از Catalog View مرتبط استفاده کنید و علاوه بر ساختار، رفتار واقعی Insert، Update، Delete یا SELECT را آزمایش نمایید.
SELECT DB_NAME() AS CurrentDatabase,
SUSER_SNAME() AS LoginName,
ORIGINAL_LOGIN() AS OriginalLogin,
SYSDATETIME() AS CheckedAt;
این Query محیط اجرا و حساب جاری را ثبت میکند. در Scriptهای حساس بهتر است خروجی کنترل قبل و بعد در جدول تاریخچه Deployment ذخیره شود تا بررسی رخدادها و Rollback قابل اعتماد باشد.
رفتار با NULL، انواع داده، Unicode و Collation
NULL
NULL با صفر یا رشته خالی یکسان نیست و باید با IS NULL یا IS NOT NULL بررسی شود. منطق سهارزشی SQL Server باعث میشود نتیجه مقایسه با NULL همیشه مانند مقایسه مقدار معمولی نباشد؛ بنابراین از عبارت Column = NULL استفاده نکنید.
انواع داده
برای پول decimal، برای زمان datetime2 و برای متن فارسی nvarchar انتخاب مناسبتری است. نوع داده بزرگتر از نیاز، اندازه ردیف و ایندکس، حافظه Grant و I/O را افزایش میدهد. نوع داده دو طرف Join و Predicate نیز باید سازگار باشد.
Unicode و Collation
برای متن فارسی از nvarchar یا nchar و Literal دارای N استفاده کنید. Collation حساسیت به حروف، اعراب و قواعد مرتبسازی را تعیین میکند. اختلاف Collation بین Databaseها ممکن است خطا یا Convert ضمنی ایجاد کند.
DECLARE @Title nvarchar(100) = N'آموزش SQL Server';
SELECT @Title AS PersianTitle,
DATALENGTH(@Title) AS StorageBytes,
SQL_VARIANT_PROPERTY(@Title, 'BaseType') AS BaseType;
Performance، Index و Execution Plan
وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند. اثر CREATE SYNONYM را با داده نزدیک به تولید بسنجید. مدت اجرا، CPU، Logical Reads، Writes، اندازه Log، Blocking و تعداد Recompile باید قبل و بعد ثبت شوند.
Seek همیشه بهتر از Scan نیست و هزینه درصدی Plan فقط تخمین نسبی است. Estimated Rows و Actual Rows، Sort، Hash Spill، Key Lookup، Implicit Conversion و Warningهای Plan را بررسی کنید. Query Store برای مقایسه Regression قبل و بعد از Deployment بسیار مفید است.
- ایندکسهای تکراری یا همپوشان را قبل از ساخت ایندکس جدید بررسی کنید.
- آمار معتبر و Predicate قابل جستجو برای انتخاب Plan مناسب ضروریاند.
- عملیات حجیم را با فضای کافی Log و tempdb اجرا کنید.
- در Availability Group تأخیر Replica ثانویه را مانیتور کنید.
SET STATISTICS IO, TIME ON;
SELECT TOP (100)
object_id, name, type_desc
FROM sys.objects
ORDER BY object_id DESC;
SET STATISTICS IO, TIME OFF;
نکات امنیتی
برای ساخت CREATE SYNONYM و ALTER روی Schema؛ برای استفاده نیز مجوز شیء پایه لازم است. مجوز DDL و مدیریت اشیا باید از حساب برنامه عادی جدا باشد. تغییرات حساس را با SQL Audit، Extended Events یا سامانه Change Management ثبت کنید.
نام شیء دریافتشده از کاربر را مستقیماً به Dynamic SQL متصل نکنید. Parameter فقط برای داده است و برای Identifier باید Whitelist و QUOTENAME استفاده شود. همچنین مالک Schema و Ownership Chain را بررسی کنید.
DECLARE @SchemaName sysname = N'dbo';
DECLARE @ObjectName sysname = N'Orders';
SELECT QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@ObjectName)
AS SafeTwoPartName;
خطاهای رایج، محدودیتها و Edge Caseها
وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند. خطاهای رایج شامل اجرای دستور در Database اشتباه، نداشتن Backup، نامگذاری متفاوت بین محیطها، بیتوجهی به اتصالهای فعال و فرض خودکار بودن اصلاح وابستگیهاست.
- فراموش کردن USE یا نام دو و سهبخشی و تغییر شیء همنام در Database دیگر.
- اجرای مستقیم روی جدول بزرگ بدون شبیهسازی زمان Sch-M Lock.
- نداشتن Script بازگشت و اتکا به ویرایش دستی در SSMS.
- نادیده گرفتن ORM، Report، Job، Trigger، View و Procedureهای وابسته.
- استفاده از NOCHECK یا Disable و بازنگرداندن Constraint یا Index به حالت معتبر.
- فرض اینکه Restart سرور یا خالی بودن DMV نشاندهنده بلااستفاده بودن شیء است.
Edge Case مهم اجرای همزمان دو Deployment است. جدول تاریخچه Migration، شماره نسخه یکتا و Application Lock میتوانند از Race Condition جلوگیری کنند. همچنین Timeout ابزار استقرار به معنی Rollback کامل نیست و باید وضعیت Transaction و Metadata بررسی شود.
مقایسه با روشهای مشابه
| محور | این موضوع | نکته تصمیمگیری |
|---|
| هدف اصلی | CREATE SYNONYM یک نام محلی در Schema برای ارجاع به شیء پایه در همان Database، Database دیگر یا Linked Server ایجاد میکند. | ابتدا نیاز کسبوکار و مرز تغییر مشخص شود |
| مزیت | وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند. | اثر واقعی با تست و Query کنترلی سنجیده شود |
| کارایی | میتواند روی قفل، لاگ، I/O، آمار یا طرح اجرا اثر بگذارد | Logical Reads و Duration قبل و بعد مقایسه شوند |
| امنیت | برای ساخت CREATE SYNONYM و ALTER روی Schema؛ برای استفاده نیز مجوز شیء پایه لازم است. | اصل حداقل دسترسی و ثبت تغییر رعایت شود |
در انتخاب جایگزین، هدف اصلی را مشخص کنید: ذخیره داده، ایجاد رابط Query، تضمین یکپارچگی، تولید شناسه، انتزاع نام یا افزایش سرعت. اشیایی که Syntax مشابه دارند لزوماً نقش یکسانی در معماری ندارند.
سناریوهای واقعی
- تیم DevOps میخواهد دستور CREATE SYNONYM را به صورت Migration نسخهدار ابتدا روی Stage و سپس Production اجرا کند.
- DBA پس از تغییر، Query Store و Actual Plan را برای تشخیص Regression بررسی میکند.
- تیم امنیت مجوز مستقیم را حذف و Role اختصاصی با حداقل Permission ایجاد میکند.
- سامانه فارسی همه ستونهای متنی را nvarchar و همه Literalها را N-prefixed نگه میدارد.
- پیش از عملیات مخرب Backup گرفته و Restore آن در محیط جدا آزمایش میشود.
بهترین روشها و Pro Tips
- Schema و Database مقصد را صریح بنویسید.
- نام Constraint، Index و Object را استاندارد و معنادار انتخاب کنید.
- Script را Idempotent کنید و وجود شیء را از Catalog View معتبر بسنجید.
- وابستگیها را با sys.sql_expression_dependencies و جستجوی Source Code بررسی کنید.
- برای عملیات بزرگ اندازه Log، فضای tempdb و مدت Blocking را برآورد کنید.
- Validation Query و معیار موفقیت را قبل از اجرای تغییر آماده کنید.
- پس از استقرار خطاهای برنامه، Deadlock، CPU، I/O و Query Regression را پایش کنید.
ترفند حرفهای
در ابتدای Script شماره Ticket، نسخه، نویسنده و پیششرطها را ثبت کنید. برای هر تغییر یک بخش Precheck، Change، Postcheck و Rollback داشته باشید. این ساختار بررسی و اجرای تیمی را بسیار قابل اعتمادتر میکند.
سؤالات متداول
آیا این عملیات همیشه به توقف سرویس نیاز دارد؟
خیر، اما ممکن است Sch-M Lock، رشد شدید Log یا Blocking ایجاد کند. Online بودن یک گزینه نیز به معنی بدون قفل بودن کامل نیست.
آیا میتوان آن را داخل Transaction اجرا کرد؟
بسیاری از DDLهای SQL Server تراکنشی هستند، ولی مدت Lock و Log باید سنجیده شود. برخی گزینهها یا سرویسهای ابری محدودیت خاص دارند.
چرا متن فارسی خراب میشود؟
معمولاً ستون varchar است یا Literal بدون N نوشته شده است. از nvarchar و N استفاده کنید و Encoding فایل را UTF-8 نگه دارید.
چگونه نتیجه را کنترل کنیم؟
Catalog View مرتبط، Query تست کسبوکار، تعداد ردیف و رفتار مجوز را بررسی و خروجی را ثبت کنید.
مستندات رسمی کجاست؟
نام دقیق دستور را همراه Microsoft Learn SQL Server جستجو و صفحه متناظر با نسخه موتور خود را مطالعه کنید.
سؤالات مصاحبه
- CREATE SYNONYM چه مسئلهای را حل میکند و مهمترین ریسک آن چیست؟
- اثر این تغییر بر Transaction Log و Locking را چگونه اندازهگیری میکنید؟
- چه تفاوتی میان Constraint، Index، View و Trigger در این سناریو وجود دارد؟
- برای رشته فارسی چه نوع داده و Collation انتخاب میکنید؟
- چگونه وابستگیها و Rollback را پیش از استقرار آزمایش میکنید؟
تمرین و Quiz
در یک Database آزمایشی برای دستور CREATE SYNONYM سناریو بسازید. Script اجرا، Query کنترل، اندازهگیری زمان و Script بازگشت را بنویسید. سپس یک خطای عمدی ایجاد کنید و رفتار Transaction را ثبت نمایید.
- حداقل مجوز لازم چیست؟
- کدام Catalog View نتیجه را نشان میدهد؟
- رفتار NULL چگونه است؟
- کدام وابستگی ممکن است پنهان بماند؟
- کدام معیار کارایی را قبل و بعد مقایسه میکنید؟
Cheat Sheet و نکات کلیدی
- موضوع: CREATE SYNONYM
- دسته: انتزاع نام اشیا
- نسخه: SQL Server 2005 و نسخههای جدیدتر
- مجوز: برای ساخت CREATE SYNONYM و ALTER روی Schema؛ برای استفاده نیز مجوز شیء پایه لازم است.
- نکته فنی: وجود کامل مقصد ممکن است هنگام CREATE بررسی نشود و خطا در زمان استفاده ظاهر شود. مجوز مقصد، Linked Server و تفاوت Collation باید تست شوند.
- قبل از اجرا: محیط، Backup، وابستگی، فضای Log و Session فعال.
- بعد از اجرا: Metadata، تست کسبوکار، Plan، خطا و مانیتورینگ.
دانلود اسکریپت نمونه و منابع
بلوکهای کد این مقاله اسکریپت نمونه قابل کپی در SSMS هستند. آنها را با نام اشیای محیط خود تطبیق دهید و در فایل UTF-8 و Source Control ذخیره کنید. اجرای مستقیم نمونه آموزشی روی Production توصیه نمیشود.
برای مطالعه بیشتر مستندات رسمی Microsoft Learn درباره CREATE SYNONYM، Catalog Viewهای مرتبط، Permissionها، Locking و Transaction Log را بررسی کنید. همچنین مباحث Query Store، Extended Events و Database Project مکمل این مقاله هستند.
تاریخچه نسخه، کلمات کلیدی و برچسبها
SQL Server 2005 و نسخههای جدیدتر. نحو پایه این قابلیت در نسخههای اشارهشده پایدار است، اما گزینههای Online، Resumable، سرویسهای ابری، Query Optimizer و Permissionها ممکن است میان نسخهها تفاوت داشته باشند. در مهاجرت نسخه، تست Regression و بررسی Microsoft Learn ضروری است.
کلمات کلیدی این مقاله عبارتاند از: CREATE SYNONYM, SQL Server, دستور CREATE SYNONYM, آموزش SQL, T-SQL, پایگاه داده. برچسبهای پیشنهادی: SQL، SQL_Server، CREATE_SYNONYM، انتزاع_نام_اشیا، آموزش_SQL، مقاله_پایگاه_داده. این اطلاعات برای دستهبندی CMS و SEO استفاده میشوند و نباید به شکل Keyword Stuffing در متن تکرار شوند.
راهنمای تحلیل حرفهای پیش از اجرا
هدف دقیق دستور CREATE SYNONYM و مالک کسبوکار را مشخص کنید؛ درخواست مبهم فنی ممکن است نیاز واقعی دیگری داشته باشد.
تعریف فعلی و Metadata مربوط به CREATE SYNONYM را قبل از تغییر در مخزن Deployment ذخیره کنید.
حجم ردیف، اندازه شیء، نرخ تراکنش و ظرفیت دیسک را اندازهگیری کنید؛ حدس در Production قابل قبول نیست.
قفل مورد نیاز را با داده نزدیک به تولید شبیهسازی کنید و طولانیترین Query فعال را در نظر بگیرید.
رشد Transaction Log را در سناریوی بدبینانه تخمین بزنید و سرعت Backup Log و Replicaها را کنترل کنید.
Script باید در اجرای دوباره رفتار مشخص داشته باشد و با پیام روشن از وضعیت پیششرط نامعتبر جلوگیری کند.
معیار موفقیت مثل وجود شیء، Trusted بودن Constraint، کاهش Logical Reads یا عدم تغییر تعداد ردیف تعریف کنید.
Rollback را واقعاً اجرا و زمان آن را اندازهگیری کنید؛ فقط داشتن Backup بدون آزمون Restore کافی نیست.
پس از استقرار بازه پایش مشخصی برای خطا، Blocking، Deadlock، CPU، I/O و Regression تعیین کنید.
علت تغییر، Ticket، نسخه SQL Server، مجری، زمان و نتیجه Validation را در Change Log ثبت کنید.
چکلیست نهایی
- Server و Database مقصد تأیید شدهاند.
- Backup یا روش بازگشت معتبر و آزمایششده وجود دارد.
- مجوز اجرا حداقلی و حساب استقرار مشخص است.
- وابستگیهای Database و کد برنامه بررسی شدهاند.
- رشتههای فارسی Unicode و Collation مناسب دارند.
- زمان Lock، مصرف Log و tempdb برآورد شده است.
- Script با داده نزدیک به تولید در Test اجرا شده است.
- Query کنترلی و معیار موفقیت آماده است.
- مانیتورینگ بعد از استقرار برنامهریزی شده است.
- Script و نتیجه در Source Control و Change Log ثبت میشوند.
جمعبندی
دستور CREATE SYNONYM زمانی ارزش واقعی ایجاد میکند که همراه با طراحی صحیح، حداقل مجوز، آزمون وابستگی و اندازهگیری کارایی استفاده شود. CREATE SYNONYM یک نام محلی در Schema برای ارجاع به شیء پایه در همان Database، Database دیگر یا Linked Server ایجاد میکند. با اجرای نمونهها در محیط آزمایشی و رعایت چکلیست، ریسک تغییر کاهش مییابد.
SQL Server Syntax را اجرا میکند، اما مسئولیت صحت کسبوکار، امنیت و قابلیت بازیابی بر عهده طراح و مجری است. هر تغییر موفق باید هم از نظر فنی و هم عملیاتی قابل اثبات باشد.