IDENT_CURRENT() در SQL Server؛ آموزش جامع، ۱۰ مثال و نکات Performance

آموزش کامل IDENT_CURRENT() در SQL Server؛ آخرین Identity یک جدول

توسط admin | گروه SQL Server | 1405/04/29

نظرات 0

آموزش جامع IDENT_CURRENT() در SQL Server؛ آخرین Identity یک جدول

مقدمه

IDENT_CURRENT() یکی از قابلیت‌های سیستمی Transact-SQL است که در عیب‌یابی، کنترل عملیات و ثبت Metadata کاربرد دارد. این مقاله از تعریف پایه شروع می‌کند و سپس با ده مثال مستقل، رفتار واقعی آن را در SQL Server توضیح می‌دهد.

آخرین مقدار Identity تولیدشده برای یک جدول مشخص را مستقل از نشست و Scope گزارش می‌کند. دانستن همین تعریف کافی نیست؛ باید مرز نشست، Scope، آخرین Statement و اثر دستورهای بعدی را نیز شناخت تا مقدار خروجی به اشتباه به عملیات دیگری نسبت داده نشود.

در پروژه‌های عملی بهتر است استفاده از IDENT_CURRENT() بخشی از یک قرارداد روشن باشد: دستور اجرا می‌شود، مقدار بلافاصله دریافت می‌گردد، وضعیت خطا یا تراکنش کنترل می‌شود و نتیجه لازم برای لاگ یا لایه برنامه بازگردانده می‌شود.

برای مشاهده جایگاه این قابلیت در کنار سایر توابع سیستمی، راهنمای جامع توابع سیستمی SQL Server را نیز مطالعه کنید.

تعریف، کاربرد و مرز عملکرد

نوع خروجی IDENT_CURRENT() برابر numeric(38,0) است. هنگام ذخیره در ستون یا متغیر، نوع مقصد را آگاهانه انتخاب کنید؛ تبدیل ضمنی ممکن است در حجم بالا، مقدار بزرگ یا تغییر Schema باعث خطای سرریز یا رفتار پیش‌بینی‌نشده شود.

به نشست جاری محدود نیست و در سیستم هم‌زمان نباید برای تعیین شناسه ردیفی که همین کاربر درج کرده استفاده شود. این نکته به‌ویژه زمانی مهم است که Trigger، Dynamic SQL، Stored Procedure تو‌در‌تو، Connection Pooling یا چند دستور تشخیصی در مسیر اجرا وجود دارد.

خروجی صفر، NULL یا مقدار قدیمی الزاماً خطای موتور نیست؛ گاهی تعریف تابع دقیقاً چنین رفتاری دارد. برای تحلیل درست، یک آزمایش کوچک در همان اتصال بسازید و قبل و بعد از هر Statement مقدارهای مرتبط را ثبت کنید.

قاعده طلایی: به نشست جاری محدود نیست و در سیستم هم‌زمان نباید برای تعیین شناسه ردیفی که همین کاربر درج کرده استفاده شود. نتیجه را همراه با زمینه اجرا تفسیر کنید و از تبدیل یک مقدار سیستمی به فرض تجاری بدون آزمون پرهیز نمایید.

Syntax و نوع خروجی

نحو پایه IDENT_CURRENT() کوتاه است، اما محل فراخوانی آن معنای خروجی را تعیین می‌کند. نمونه زیر خروجی را با نام ستونی واضح ارائه می‌دهد تا مصرف آن در ابزار گزارش‌گیری یا کد برنامه خوانا باشد.

SELECT IDENT_CURRENT(N'dbo.TableName') AS CurrentIdentity;

نوع بازگشتی numeric(38,0) است. برای API یا لایه داده، نوع C# یا مقصد پایگاه داده را مطابق همین نوع و دامنه مقادیر انتخاب کنید و حالت NULL را، هرجا از نظر معنایی ممکن است، صریح مدیریت نمایید.

مثال‌های عملی از پایه تا حرفه‌ای

ده مثال زیر مستقل طراحی شده‌اند. هر نمونه هدف، Query کامل، خروجی مورد انتظار و نکته کاربردی دارد. اشیای آزمایشی را در پایگاه توسعه اجرا کنید و از اجرای کدهای آموزشی روی Production بدون بازبینی مجوز و اثر قفل خودداری نمایید.

مثال 1: خواندن مقدار جدول نمونه

مثال پایه با مقدار یا محیط کنترل‌شده است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

CREATE TABLE #CurrentDemo(Id int IDENTITY(1,1), Value int);
    INSERT #CurrentDemo(Value) VALUES(1),(2);
    SELECT IDENT_CURRENT(N'tempdb..#CurrentDemo') AS CurrentId;
    DROP TABLE #CurrentDemo;
خروجی مورد انتظارتفسیر
2 یا وابسته به نام داخلی جدول موقتنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 2: استفاده مطمئن با جدول دائمی آزمایشی

نمونه قابل اجرا روی داده آزمایشی است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DROP TABLE IF EXISTS dbo.IdentityCurrentDemo;
    CREATE TABLE dbo.IdentityCurrentDemo(Id int IDENTITY(20,2), Value int);
    INSERT dbo.IdentityCurrentDemo(Value) VALUES(1),(2);
    SELECT IDENT_CURRENT(N'dbo.IdentityCurrentDemo') AS CurrentId;
    DROP TABLE dbo.IdentityCurrentDemo;
خروجی مورد انتظارتفسیر
22نتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 3: مقایسه با SCOPE IDENTITY

کاربرد در SELECT و مشاهده خروجی است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DROP TABLE IF EXISTS dbo.IdentityCompareDemo;
    CREATE TABLE dbo.IdentityCompareDemo(Id int IDENTITY, Value int);
    INSERT dbo.IdentityCompareDemo(Value) VALUES(8);
    SELECT SCOPE_IDENTITY() AS ScopeId, IDENT_CURRENT(N'dbo.IdentityCompareDemo') AS TableId;
    DROP TABLE dbo.IdentityCompareDemo;
خروجی مورد انتظارتفسیر
هر دو 1 در یک نشستنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 4: اثر Seed سفارشی

کاربرد در تصمیم‌گیری یا کنترل جریان است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DROP TABLE IF EXISTS dbo.IdentitySeedDemo;
    CREATE TABLE dbo.IdentitySeedDemo(Id int IDENTITY(100,10), Value int);
    INSERT dbo.IdentitySeedDemo(Value) VALUES(1);
    SELECT IDENT_CURRENT(N'dbo.IdentitySeedDemo') AS CurrentId;
    DROP TABLE dbo.IdentitySeedDemo;
خروجی مورد انتظارتفسیر
100نتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 5: پس از TRUNCATE

ترکیب با قابلیت‌های دیگر SQL Server است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DROP TABLE IF EXISTS dbo.IdentityTruncateDemo;
    CREATE TABLE dbo.IdentityTruncateDemo(Id int IDENTITY(5,1), Value int);
    INSERT dbo.IdentityTruncateDemo(Value) VALUES(1);
    TRUNCATE TABLE dbo.IdentityTruncateDemo;
    SELECT IDENT_CURRENT(N'dbo.IdentityTruncateDemo') AS CurrentAfterTruncate;
    DROP TABLE dbo.IdentityTruncateDemo;
خروجی مورد انتظارتفسیر
مقدار Seed یعنی 5نتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 6: نام شیء نامعتبر

بررسی مقدار تهی یا وضعیت بدون داده است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT IDENT_CURRENT(N'dbo.TableThatDoesNotExist') AS InvalidObject;
خروجی مورد انتظارتفسیر
NULLنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 7: تبدیل نوع خروجی

رفتار مرزی و شرایط غیرمعمول است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT CONVERT(bigint, IDENT_CURRENT(N'sys.objects')) AS MetadataValue;
خروجی مورد انتظارتفسیر
عدد یا NULL وابسته به شیءنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 8: گزارش Metadata چند جدول

سناریوی واقعی پایش یا گزارش‌گیری سازمانی است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT t.name, IDENT_CURRENT(QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(t.name)) AS CurrentIdentity
    FROM sys.tables AS t
    WHERE OBJECTPROPERTY(t.object_id, 'TableHasIdentity') = 1;
خروجی مورد انتظارتفسیر
فهرست جدول‌های Identityنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 9: روش ناامن پیش‌بینی شناسه

روش اشتباه و نسخه اصلاح‌شده است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

DROP TABLE IF EXISTS dbo.IdentityRaceDemo;
    CREATE TABLE dbo.IdentityRaceDemo(Id int IDENTITY, Value int);
    SELECT IDENT_CURRENT(N'dbo.IdentityRaceDemo') + IDENT_INCR(N'dbo.IdentityRaceDemo') AS PredictedButUnsafe;
    INSERT dbo.IdentityRaceDemo(Value) OUTPUT inserted.Id VALUES(1);
    DROP TABLE dbo.IdentityRaceDemo;
خروجی مورد انتظارتفسیر
OUTPUT شناسه واقعی را می‌دهدنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: این نمونه مرز میان روش شکننده و الگوی قابل اتکا را نشان می‌دهد. به نشست جاری محدود نیست و در سیستم هم‌زمان نباید برای تعیین شناسه ردیفی که همین کاربر درج کرده استفاده شود. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

مثال 10: پایش بدون استفاده تجاری

نکته کارایی، ایمنی یا نگهداشت‌پذیری است. هدف این است که رفتار IDENT_CURRENT() در یک Batch روشن دیده شود و نتیجه به حدس یا وضعیت اتصال دیگری وابسته نباشد. کد را ابتدا در محیط آزمایشی اجرا کنید و در پروژه واقعی نام اشیا و مجوزها را با استاندارد سازمان هماهنگ سازید.

SELECT s.name AS SchemaName, t.name AS TableName, ic.seed_value, ic.increment_value, ic.last_value
    FROM sys.identity_columns AS ic
    JOIN sys.tables AS t ON t.object_id = ic.object_id
    JOIN sys.schemas AS s ON s.schema_id = t.schema_id;
خروجی مورد انتظارتفسیر
گزارش مشخصات Identityنتیجه، رفتار IDENT_CURRENT() را در همین سناریو نشان می‌دهد.

نکته کاربردی: پس از اجرای دستور، خروجی را در همان Scope و نشست تفسیر کنید. خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. در سامانه پرترافیک، ثبت زمان، نام پایگاه داده و شناسه نشست کنار نتیجه می‌تواند عیب‌یابی را سریع‌تر کند.

خطاهای رایج

بخش مهم یادگیری IDENT_CURRENT() شناخت خطاهایی است که Syntax صحیح دارند اما منطق نادرست تولید می‌کنند. این خطاها ممکن است در تست تک‌کاربره دیده نشوند و فقط زیر بار یا با Trigger آشکار گردند.

  • 1. استفاده برای بازیابی شناسه درج خود کاربر. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 2. ساخت نام جدول از ورودی تأییدنشده. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 3. نادیده گرفتن مجوز مشاهده شیء. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.
  • 4. فرض اینکه مقدار جاری همیشه با تعداد ردیف‌ها برابر است. برای اصلاح، مرز تابع و ترتیب Statementها را مستند و با یک تست قابل تکرار کنترل کنید.

در رخداد واقعی، تنها پیام خطا کافی نیست. نام Procedure، شماره خط، ورودی‌های پالایش‌شده، وضعیت تراکنش و شناسه نشست را ثبت کنید تا علت اصلی از نشانه ثانویه تفکیک شود.

Performance و بهینه‌سازی

خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست.

برای سنجش اثر واقعی، قبل و بعد از تغییر کد از Query Store، Actual Execution Plan، SET STATISTICS IO/TIME و در صورت نیاز Extended Events استفاده کنید. اندازه‌گیری باید روی Query اصلی، تعداد Logical Read، زمان CPU، مدت قفل و حجم Log متمرکز باشد.

از اجرای Query اضافی فقط برای بازسازی اطلاعاتی که موتور همان لحظه در اختیار گذاشته اجتناب کنید. در عین حال، تابع سیستمی را جایگزین کنترل صحت داده، Constraint، ایندکس مناسب یا طراحی Transaction نکنید.

در پردازش گروهی، نتیجه هر Batch را ثبت کنید و اندازه Batch را طوری تنظیم نمایید که زمان قفل و رشد Log قابل کنترل باشد. شکست جزئی باید سیاست Retry محدود و Idempotency مشخص داشته باشد.

بهترین روش‌ها و کاربرد سازمانی

  • مقدار IDENT_CURRENT() را در نزدیک‌ترین نقطه به دستور مرجع بخوانید.
  • نوع خروجی numeric(38,0) و امکان NULL یا صفر را صریح در مدل داده لحاظ کنید.
  • برای خطا از TRY...CATCH، THROW و XACT_STATE با قرارداد یکسان استفاده کنید.
  • کد را زیر هم‌زمانی واقعی و در حضور Trigger یا Connection Pooling آزمایش کنید.
  • از Hard-code کردن نام محیط و فرض‌های وابسته به ترتیب اجرا خودداری کنید.
  • در لاگ، SPID، زمان، نام دیتابیس و شناسه همبستگی را بدون داده حساس نگه دارید.

در سامانه‌های فروش، مالی، انبار، اتوماسیون یا گزارش‌گیری، این الگو به تیم پشتیبانی کمک می‌کند نتیجه هر عملیات را سریع‌تر ردیابی کند. ارزش اصلی زمانی ایجاد می‌شود که Metadata فنی با شناسه تجاری سفارش یا درخواست مرتبط شود.

برای مهاجرت نسخه یا انتقال به محیط جدید، مجموعه تست سازگاری بسازید. Compatibility Level، مجوز DMVها، رفتار Driver و تنظیمات Connection Pool می‌توانند روی مشاهده‌پذیری پیرامون تابع اثر بگذارند، حتی اگر Syntax خود تابع ثابت مانده باشد.

سؤالات متداول

پرسش 1: IDENT_CURRENT() دقیقاً چه کاری انجام می‌دهد؟

IDENT_CURRENT() آخرین مقدار Identity تولیدشده برای یک جدول مشخص را مستقل از نشست و Scope گزارش می‌کند. خروجی باید در متن همان Batch و با توجه به Scope، Session و دستور قبلی تفسیر شود؛ جدا کردن آن از زمینه اجرا می‌تواند نتیجه‌ای ظاهراً درست اما از نظر تجاری اشتباه بسازد.

پرسش 2: بهترین زمان خواندن IDENT_CURRENT() چه موقع است؟

بهترین زمان بلافاصله پس از دستور مرتبط است. اگر مقدار برای چند مرحله بعد لازم است، آن را در متغیری با نوع مناسب ذخیره کنید و همراه شناسه عملیات ثبت نمایید تا دستورهای واسط مقدار یا معنای آن را تغییر ندهند.

پرسش 3: آیا IDENT_CURRENT() برای سامانه‌های سازمانی مناسب است؟

بله، مشروط بر اینکه قرارداد استفاده، مدیریت خطا و تست هم‌زمانی مشخص باشد. در طراحی حرفه‌ای، این تابع بخشی از راه‌حل است و در کنار Transaction، Logging، مجوز حداقلی و پایش Query به کار می‌رود.

پرسش 4: برای پیاده‌سازی صحیح آن به مشاوره SQL Server نیاز است؟

در کد ساده خیر، اما در سامانه‌های مالی، انبار، احراز هویت یا پردازش گروهی بررسی Triggerها، Scopeها و الگوی تراکنش اهمیت زیادی دارد. بازبینی تخصصی می‌تواند از خطاهای خاموش و هزینه اصلاح داده جلوگیری کند.

پرسش 5: تفاوت IDENT_CURRENT() با گزینه‌های نزدیک چیست؟

تفاوت اصلی در دامنه مشاهده و نوع اطلاعات است. باید مشخص شود نیاز شما مربوط به آخرین Statement، نشست جاری، Scope جاری، جدول مشخص یا Metadata سرور است؛ سپس تابعی انتخاب شود که دقیقاً همان مرز را پوشش دهد.

پرسش 6: آیا می‌توان این الگو را در Stored Procedure پروژه پیاده کرد؟

بله. بهتر است مقدار در همان Procedure گرفته شود، نوع خروجی صریح باشد، خطا با TRY...CATCH مدیریت شود و نتیجه از طریق Result Set، پارامتر OUTPUT یا قرارداد سرویس بازگردد. تست یکپارچه نیز حالت موفق و شکست را پوشش دهد.

پرسش 7: خطای رایج هنگام استفاده از IDENT_CURRENT() چیست؟

استفاده برای بازیابی شناسه درج خود کاربر یکی از خطاهای متداول است. خطای دیگر، اتکا به نتیجه بدون ثبت Context اجراست. نسخه اصلاح‌شده باید زمان خواندن، Scope، رفتار تراکنش و نوع تبدیل را آشکار کند.

پرسش 8: اثر IDENT_CURRENT() بر Performance چیست؟

خواندن Metadata سبک است، ولی استفاده مکرر برای پیش‌بینی شناسه بعدی هم ناامن و هم مستعد رقابت میان نشست‌هاست. هزینه اصلی معمولاً از Query یا Transaction پیرامون آن می‌آید، نه خود تابع. اندازه‌گیری با Actual Execution Plan، Query Store و Extended Events باید روی کل جریان انجام شود.

پرسش 9: Best Practice اصلی برای IDENT_CURRENT() چیست؟

مقدار را نزدیک به دستور مرجع بخوانید، در نوع مناسب ذخیره کنید، نتیجه‌های مرزی مانند صفر یا NULL را تست کنید و برای عملیات حساس گزارش ممیزی بسازید. از تکیه بر ترتیب اتفاقی دستورات یا رشته‌های Hard-coded دوری کنید.

پرسش 10: این قابلیت در کدام نسخه‌های SQL Server کار می‌کند؟

این قابلیت در نسخه‌های رایج و پشتیبانی‌شده SQL Server در دسترس است، اما امکانات مکمل مانند SESSION_CONTEXT، THROW یا برخی DMVها به نسخه و سطح سازگاری وابسته‌اند. پیش از استقرار، مستندات همان نسخه و Compatibility Level پایگاه داده را کنترل کنید.

سؤالات مصاحبه SQL Server

سؤال 1: مرز مشاهده IDENT_CURRENT() چیست؟

پاسخ حرفه‌ای باید مشخص کند تابع به Statement، Scope، Session، Table یا Server مربوط است و یک مثال نقض نیز ارائه دهد. گفتن نام تابع بدون توضیح مرز مشاهده برای مصاحبه فنی کافی نیست.

سؤال 2: چگونه مقدار را بدون Race Condition مصرف می‌کنید؟

مقدار باید نزدیک به عملیات مرجع، در همان اتصال و داخل قرارداد تراکنش خوانده شود. برای چند ردیف یا خروجی‌های حساس، قابلیت OUTPUT یا Metadata ساخت‌یافته می‌تواند انتخاب دقیق‌تری باشد.

سؤال 3: در CATCH چه اطلاعاتی ثبت می‌کنید؟

شماره و متن خطا، Procedure، Line، XACT_STATE، @@TRANCOUNT، نام پایگاه داده، SPID و شناسه همبستگی از اطلاعات مفید هستند. داده حساس نباید بدون پالایش وارد Log شود.

سؤال 4: چطور این کد را تست می‌کنید؟

تست موفق، نتیجه خالی، خطا، تراکنش باز، اجرای هم‌زمان و وجود Trigger یا دستور واسط باید جداگانه پوشش داده شود. تست باید مقدار خروجی و وضعیت نهایی داده را هر دو بررسی کند.

سؤال 5: چه زمانی گزینه دیگری را انتخاب می‌کنید؟

وقتی تابع مرز موردنیاز را پوشش نمی‌دهد یا فقط یک مقدار از مجموعه‌ای بزرگ را برمی‌گرداند. انتخاب باید بر اساس هدف تجاری، هم‌زمانی، نسخه SQL Server و قابلیت مشاهده‌پذیری انجام شود.

چک‌لیست نهایی

  • تعریف و مرز IDENT_CURRENT() را با یک مثال توضیح داده‌ام.
  • مقدار بلافاصله پس از دستور مرتبط ذخیره می‌شود.
  • حالت صفر، NULL، خطا و هم‌زمانی تست شده است.
  • تراکنش در مسیر موفق Commit و در مسیر شکست Rollback می‌شود.
  • نتیجه با نوع مناسب و نام ستون روشن به لایه مصرف‌کننده می‌رسد.
  • لاگ فنی برای عیب‌یابی وجود دارد و داده حساس ثبت نمی‌شود.

جمع‌بندی

IDENT_CURRENT() آخرین مقدار Identity تولیدشده برای یک جدول مشخص را مستقل از نشست و Scope گزارش می‌کند. استفاده حرفه‌ای از آن به معنی شناخت دقیق مرز، خواندن در زمان مناسب، مدیریت نوع خروجی و آزمون رفتار در شرایط واقعی است.

برای تکمیل مسیر یادگیری و مقایسه با قابلیت‌های مرتبط، به مقاله مادر توابع سیستمی SQL Server بازگردید. مثال‌ها را ابتدا در محیط آزمایشی اجرا و سپس با استاندارد تراکنش، امنیت و مانیتورینگ پروژه خود تطبیق دهید.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620