سه شنبه, ۲۸ خرداد ۱۳۹۸ ۰۴:۲۲:۰۰

اضافه شدن ناگهانی 1000 به اعداد شماره سفارش

2 ماه قبل
#1745 نقل و قول
سلام
مشکلی در ترتیب شماره سفارشات ما پیش آمده. البته مسئله ی بزرگی نیست. شماره ها از 537898 به 538898 رفته. آیا برای شما هم پیش آمده؟ علت چیست؟
0
2 ماه قبل
#1750 نقل و قول
بله من هم چندوقت قبل به این مشکل برخوردم
اون موقع فقط IIS رو متوقف کردم و مجددا راه اندازیش کردم
هنوزم نمیدونم چرا اون اتفاق افتاد
ورژن 4.0 هست سایت من
چیزی پیدا کردید همینجا بنویسید لطفا
0
2 ماه قبل
#1752 نقل و قول
بله من هم قبلا به این مورد برخوردم . اما این مشکل ناپ کامرس و کدهای اون نیست . بلکه یک باگ در SQL server 2012 هست و زمانی اتفاق میفته که SQL server 2012 ترتیب قبلی اعداد رو گم میکنه.
اینجا یک راه حل مطرح شده:
http://big.info/2013/01/how-to-solve-sql-server-2012-identity.html
0
2 ماه قبل
#1754 نقل و قول
سلام
من از sp_FixSeeds2012 که اینجا نوشته شده
https://connect.microsoft.com/SQLServer/feedback/details/739013/alwayson-failover-results-in-reseed-of-identity 
استفاده کردم.
یه سری تغییرات هم ایجاد کردم که vieweها رو چک نکنه و یکمی هم تغییرات در رابطه با دیتابیس که در ادامه میتونید ببینید اسکریپت اصلاح شده رو:

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_FixSeeds2012] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_FixSeeds2012]
AS
BEGIN

    --foreach database
    DECLARE @DatabaseName varchar(255)
    
    DECLARE DatabasesCursor CURSOR READ_ONLY
    FOR
        SELECT name
        FROM sys.databases
        where name not in ('master','tempdb','model','msdb') and sys.databases.state_desc = 'online'

    OPEN DatabasesCursor

    FETCH NEXT FROM DatabasesCursor
    INTO @DatabaseName

    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        EXEC ('USE ['+@DatabaseName + ']

        --foreach identity column
        DECLARE @tableName varchar(255)
        DECLARE @columnName varchar(255)
        DECLARE @schemaName varchar(255)
      
        DECLARE IdentityColumnCursor CURSOR READ_ONLY
        FOR
        
      SELECT
        TABLE_NAME =t.name,
        COLUMN_NAME =c.name,
        TABLE_SCHEMA = s.name
      FROM
        sys.schemas AS s
        INNER JOIN sys.tables AS t ON s.schema_id = t.schema_id
        INNER JOIN sys.columns AS c ON t.object_id = c.object_id
        INNER JOIN sys.identity_columns AS ic on c.object_id = ic.object_id AND c.column_id = ic.column_id
      GROUP BY
        s.name,
        t.name,
        c.name

      SELECT
        TABLE_NAME =t.name,
        COLUMN_NAME =c.name,
        TABLE_SCHEMA = s.name
      FROM
        sys.schemas AS s
        INNER JOIN sys.tables AS t ON s.schema_id = t.schema_id
        INNER JOIN sys.columns AS c ON t.object_id = c.object_id
        INNER JOIN sys.identity_columns AS ic on c.object_id = ic.object_id AND c.column_id = ic.column_id
      WHERE last_value IS NOT NULL
      GROUP BY
        s.name,
        t.name,
        c.name            

        OPEN IdentityColumnCursor

        FETCH NEXT FROM IdentityColumnCursor
        INTO @tableName, @columnName, @schemaName

        WHILE @@FETCH_STATUS = 0
        BEGIN
        
            print ''['+@DatabaseName+'].[''+@tableName+''].[''+@schemaName+''].[''+@columnName+'']''  
            EXEC (''declare @MAX int = 0
                    select @MAX = max(''+@columnName+'') from ['+@DatabaseName+'].[''+@schemaName+''].[''+@tableName+'']
                    if (@MAX IS NULL)
                    BEGIN
                        SET @MAX = 0
                    END
          IF ('''''+@DatabaseName+''''' LIKE ''''%.%'''')
            BEGIN
              DBCC CHECKIDENT([''+@schemaName+''.''+@tableName+''],RESEED,@MAX)
            END
                    ELSE
            BEGIN
              DBCC CHECKIDENT(['+@DatabaseName+'.''+@schemaName+''.''+@tableName+''],RESEED,@MAX)
            END
                    '')

            FETCH NEXT FROM IdentityColumnCursor
            INTO @tableName, @columnName, @schemaName

        END

        CLOSE IdentityColumnCursor
        DEALLOCATE IdentityColumnCursor')

        FETCH NEXT FROM DatabasesCursor
        INTO @DatabaseName

    END

    CLOSE DatabasesCursor
    DEALLOCATE DatabasesCursor
END


EXEC sp_procoption @ProcName = 'sp_FixSeeds2012'
    , @OptionName = 'startup'
    , @OptionValue = 'true'
GO

بعضی اوقات اضافه کردن"t272-"  که دوستان گفتن هم جواب میده. البته با حروف کوچیک.
0
2 ماه قبل
#1758 نقل و قول
سلام
فکر میکنم بهترین گزینه اینه که از توالی استفاده کنیم (بدون ذخیره سازی کش Cache)
در SQL به جای identity:

CREATE SEQUENCE MySeq AS int
START WITH 1
INCREMENT BY 1
NO CACHE;
0