آموزش کامل دستور CREATE SEQUENCE در SQL Server
معرفی و هدف مقاله
دستور CREATE SEQUENCE از مباحث مهم طراحی و نگهداری سامانههای مبتنی بر Microsoft SQL Server است. این مقاله موضوع CREATE SEQUENCE را از تعریف اولیه تا کاربرد حرفهای، خطاهای رایج، رفتار با NULL، Unicode، Collation، Index و Execution Plan بررسی میکند.
CREATE SEQUENCE یک مولد عدد مستقل با نوع داده، مقدار شروع، گام، حداقل، حداکثر، Cycle و Cache مشخص ایجاد میکند. هدف فقط حفظ کردن Syntax نیست؛ باید بدانید دستور یا شیء مورد نظر در چه زمانی انتخاب درستی است، چه مجوزی میخواهد، چه وابستگیهایی دارد و چگونه نتیجه آن را کنترل میکنید.
همه مثالها با نام Schema صریح نوشته شدهاند. هرجا داده فارسی وارد میشود از نوع nvarchar و Literal دارای پیشوند N استفاده شده است. قبل از اجرای نمونههای مخرب، نام Server و Database، Backup و امکان Rollback را بررسی کنید.
| ویژگی | مقدار | توضیح |
|---|
| موضوع | CREATE SEQUENCE | دستور CREATE SEQUENCE |
| دستهبندی | تولید شماره | مخصوص Microsoft SQL Server |
| نسخه | SQL Server 2012 و نسخههای جدیدتر | گزینههای خاص باید با نسخه موتور کنترل شوند |
| سطح | مبتدی تا حرفهای | شامل Syntax، مثال، کارایی و امنیت |
| زمان مطالعه | ۱۵ تا ۲۰ دقیقه | با اجرای تمرینها زمان بیشتری لازم است |
| پیشنیاز | آشنایی مقدماتی با T-SQL | برای ساخت CREATE SEQUENCE و ALTER روی Schema، برای مصرف UPDATE روی Sequence و برای تغییر ALTER لازم است. |
تعریف، دستهبندی و نحوه عملکرد
CREATE SEQUENCE یک مولد عدد مستقل با نوع داده، مقدار شروع، گام، حداقل، حداکثر، Cycle و Cache مشخص ایجاد میکند. این قابلیت در دسته «تولید شماره» قرار میگیرد و نتیجه آن از طریق Catalog Viewها، DMVها یا Queryهای کنترلی قابل مشاهده است.
در SQL Server بسیاری از دستورات DDL مقدار بازگشتی شبیه تابع Scalar ندارند. موفقیت باید با نبود خطا، مشاهده Metadata جدید، آزمون رفتار داده و کنترل مصرفکنندگان اثبات شود. در محیط حرفهای این کنترل بخشی از Migration Script است.
Syntax اصلی
CREATE SEQUENCE schema_name.sequence_name
AS integer_type
START WITH start_value
INCREMENT BY increment_value
[ MINVALUE min_value | NO MINVALUE ]
[ MAXVALUE max_value | NO MAXVALUE ]
[ CYCLE | NO CYCLE ]
[ CACHE cache_size | NO CACHE ];
اجزای مهم Syntax
- نام Schema را صریح بنویسید تا Default Schema کاربر نتیجه را تغییر ندهد.
- برای نام شیء، Index و Constraint استاندارد ثابت و قابل جستجو انتخاب کنید.
- گزینههای Online، Resumable، Cache، Cycle یا Cascade را فقط بعد از بررسی نسخه و ریسک فعال کنید.
- در Dynamic SQL نام اشیا را فقط از Whitelist بگیرید و با QUOTENAME ایمن کنید.
نسخههای پشتیبانیشده و مجوزها
SQL Server 2012 و نسخههای جدیدتر پیش از استقرار، نسخه دقیق موتور و Compatibility Level را بررسی کنید. ممکن است یک Syntax در SQL Server محلی، Azure SQL Database یا Managed Instance رفتار و محدودیت متفاوتی داشته باشد.
برای ساخت CREATE SEQUENCE و ALTER روی Schema، برای مصرف UPDATE روی Sequence و برای تغییر ALTER لازم است. اعطای 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();
چه زمانی استفاده کنیم و چه زمانی استفاده نکنیم
زمان مناسب
برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است. زمانی از CREATE SEQUENCE استفاده کنید که نیاز واقعی، وابستگیها، حجم داده و پنجره نگهداری مشخص شده باشند و معیار موفقیت قابل اندازهگیری وجود داشته باشد.
زمان نامناسب
اگر هدف فقط پنهان کردن طراحی ضعیف، دور زدن Constraint، رفع موقت کندی یا حذف پیام خطا است، ابتدا علت ریشهای را پیدا کنید. تغییر ساختار بدون تحلیل ممکن است مشکل را از یک Query به کل سامانه منتقل کند.
هر تغییر خوب باید قابل تکرار، قابل ممیزی، قابل بازگشت و در Source Control ثبتشده باشد.
مثال عملی اول
CREATE SEQUENCE dbo.OrderNumberSequence
AS bigint
START WITH 100000
INCREMENT BY 1
NO CYCLE
CACHE 100;
پس از اجرا فقط به پیام Commands completed successfully اکتفا نکنید. Metadata، تعداد ردیف، Constraint معتبر، تعریف View یا وضعیت Index را با Query مستقل کنترل کنید و نتیجه را با انتظار کسبوکار مقایسه نمایید.
مثال عملی دوم روی سناریوی واقعی
CREATE SEQUENCE dbo.InvoiceYearSequence
AS int
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 999999
NO CYCLE
CACHE 50;
نام جدول، مسیر فایل، مقدارها و گزینههای این نمونه آموزشی هستند. در Production باید آنها را با محیط واقعی جایگزین و اثر Lock، Transaction Log، tempdb، Replication و Availability Group را ارزیابی کنید.
نتیجه نمونه و روش کنترل
برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است. برای کنترل CREATE SEQUENCE از 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
Sequence عدد تولید میکند و NULL تولید نمیکند؛ مصرف شماره در Rollback نیز الزاماً بازگردانده نمیشود. منطق سهارزشی SQL Server باعث میشود نتیجه مقایسه با NULL همیشه مانند مقایسه مقدار معمولی نباشد؛ بنابراین از عبارت Column = NULL استفاده نکنید.
انواع داده
نوع Sequence باید عدد صحیح یا decimal با Scale صفر باشد و انتخاب بازه کافی از Overflow جلوگیری کند. نوع داده بزرگتر از نیاز، اندازه ردیف و ایندکس، حافظه 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
برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است. اثر CREATE SEQUENCE را با داده نزدیک به تولید بسنجید. مدت اجرا، 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 SEQUENCE و ALTER روی Schema، برای مصرف UPDATE روی Sequence و برای تغییر ALTER لازم است. مجوز 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ها
برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است. خطاهای رایج شامل اجرای دستور در 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 SEQUENCE یک مولد عدد مستقل با نوع داده، مقدار شروع، گام، حداقل، حداکثر، Cycle و Cache مشخص ایجاد میکند. | ابتدا نیاز کسبوکار و مرز تغییر مشخص شود |
| مزیت | برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است. | اثر واقعی با تست و Query کنترلی سنجیده شود |
| کارایی | میتواند روی قفل، لاگ، I/O، آمار یا طرح اجرا اثر بگذارد | Logical Reads و Duration قبل و بعد مقایسه شوند |
| امنیت | برای ساخت CREATE SEQUENCE و ALTER روی Schema، برای مصرف UPDATE روی Sequence و برای تغییر ALTER لازم است. | اصل حداقل دسترسی و ثبت تغییر رعایت شود |
در انتخاب جایگزین، هدف اصلی را مشخص کنید: ذخیره داده، ایجاد رابط Query، تضمین یکپارچگی، تولید شناسه، انتزاع نام یا افزایش سرعت. اشیایی که Syntax مشابه دارند لزوماً نقش یکسانی در معماری ندارند.
سناریوهای واقعی
- تیم DevOps میخواهد دستور CREATE SEQUENCE را به صورت 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 SEQUENCE چه مسئلهای را حل میکند و مهمترین ریسک آن چیست؟
- اثر این تغییر بر Transaction Log و Locking را چگونه اندازهگیری میکنید؟
- چه تفاوتی میان Constraint، Index، View و Trigger در این سناریو وجود دارد؟
- برای رشته فارسی چه نوع داده و Collation انتخاب میکنید؟
- چگونه وابستگیها و Rollback را پیش از استقرار آزمایش میکنید؟
تمرین و Quiz
در یک Database آزمایشی برای دستور CREATE SEQUENCE سناریو بسازید. Script اجرا، Query کنترل، اندازهگیری زمان و Script بازگشت را بنویسید. سپس یک خطای عمدی ایجاد کنید و رفتار Transaction را ثبت نمایید.
- حداقل مجوز لازم چیست؟
- کدام Catalog View نتیجه را نشان میدهد؟
- رفتار NULL چگونه است؟
- کدام وابستگی ممکن است پنهان بماند؟
- کدام معیار کارایی را قبل و بعد مقایسه میکنید؟
Cheat Sheet و نکات کلیدی
- موضوع: CREATE SEQUENCE
- دسته: تولید شماره
- نسخه: SQL Server 2012 و نسخههای جدیدتر
- مجوز: برای ساخت CREATE SEQUENCE و ALTER روی Schema، برای مصرف UPDATE روی Sequence و برای تغییر ALTER لازم است.
- نکته فنی: برای شماره مشترک بین چند جدول یا رزرو شماره قبل از Insert مناسب است. نوع داده کوچک، CYCLE ناخواسته و تصور بدون Gap بودن از خطاهای رایج است.
- قبل از اجرا: محیط، Backup، وابستگی، فضای Log و Session فعال.
- بعد از اجرا: Metadata، تست کسبوکار، Plan، خطا و مانیتورینگ.
دانلود اسکریپت نمونه و منابع
بلوکهای کد این مقاله اسکریپت نمونه قابل کپی در SSMS هستند. آنها را با نام اشیای محیط خود تطبیق دهید و در فایل UTF-8 و Source Control ذخیره کنید. اجرای مستقیم نمونه آموزشی روی Production توصیه نمیشود.
برای مطالعه بیشتر مستندات رسمی Microsoft Learn درباره CREATE SEQUENCE، Catalog Viewهای مرتبط، Permissionها، Locking و Transaction Log را بررسی کنید. همچنین مباحث Query Store، Extended Events و Database Project مکمل این مقاله هستند.
تاریخچه نسخه، کلمات کلیدی و برچسبها
SQL Server 2012 و نسخههای جدیدتر. نحو پایه این قابلیت در نسخههای اشارهشده پایدار است، اما گزینههای Online، Resumable، سرویسهای ابری، Query Optimizer و Permissionها ممکن است میان نسخهها تفاوت داشته باشند. در مهاجرت نسخه، تست Regression و بررسی Microsoft Learn ضروری است.
کلمات کلیدی این مقاله عبارتاند از: CREATE SEQUENCE, SQL Server, دستور CREATE SEQUENCE, آموزش SQL, T-SQL, پایگاه داده. برچسبهای پیشنهادی: SQL، SQL_Server، CREATE_SEQUENCE، تولید_شماره، آموزش_SQL، مقاله_پایگاه_داده. این اطلاعات برای دستهبندی CMS و SEO استفاده میشوند و نباید به شکل Keyword Stuffing در متن تکرار شوند.
راهنمای تحلیل حرفهای پیش از اجرا
هدف دقیق دستور CREATE SEQUENCE و مالک کسبوکار را مشخص کنید؛ درخواست مبهم فنی ممکن است نیاز واقعی دیگری داشته باشد.
تعریف فعلی و Metadata مربوط به CREATE SEQUENCE را قبل از تغییر در مخزن 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 SEQUENCE زمانی ارزش واقعی ایجاد میکند که همراه با طراحی صحیح، حداقل مجوز، آزمون وابستگی و اندازهگیری کارایی استفاده شود. CREATE SEQUENCE یک مولد عدد مستقل با نوع داده، مقدار شروع، گام، حداقل، حداکثر، Cycle و Cache مشخص ایجاد میکند. با اجرای نمونهها در محیط آزمایشی و رعایت چکلیست، ریسک تغییر کاهش مییابد.
SQL Server Syntax را اجرا میکند، اما مسئولیت صحت کسبوکار، امنیت و قابلیت بازیابی بر عهده طراح و مجری است. هر تغییر موفق باید هم از نظر فنی و هم عملیاتی قابل اثبات باشد.