PEMERIKSAAN DBCC (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL Database Azure SQL Managed Instance Azure Synapse AnalyticsSQL database di Microsoft Fabric

Memeriksa nilai identitas saat ini untuk tabel yang ditentukan di SQL Server dan, jika diperlukan, mengubah nilai identitas. Anda juga dapat menggunakan DBCC CHECKIDENT untuk mengatur nilai identitas baru saat ini secara manual untuk kolom identitas.

Artikel ini dan sintaksnya IDENTITY berbeda pada platform yang berbeda dari SQL Database Engine. Untuk Microsoft Fabric Data Warehouse, pilih Fabric Data Warehouse di daftar dropdown versi.

Konvensi sintaks transact-SQL

Sintaks

Sintaks untuk SQL Server, Azure SQL Database, Azure SQL Managed Instance, database SQL di Fabric:

DBCC CHECKIDENT
 (
    table_name
        [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]

Sintaks untuk Azure Synapse Analytics:

DBCC CHECKIDENT
 (
    table_name
        [ RESEED , new_reseed_value ]
)
[ WITH NO_INFOMSGS ]

Argumen

table_name

Nama tabel untuk memeriksa nilai identitas saat ini. Tabel yang Anda tentukan harus berisi kolom identitas. Nama tabel harus mengikuti aturan untuk pengidentifikasi. Gunakan pembatas untuk nama dua atau tiga bagian, seperti Person.AddressType atau [Person].[AddressType].

NORESEED

Menentukan bahwa nilai identitas saat ini tidak boleh diubah.

DISEMPURNAKAN ULANG

Menentukan bahwa nilai identitas saat ini harus diubah.

new_reseed_value

Nilai baru yang akan digunakan sebagai nilai kolom identitas saat ini.

DENGAN NO_INFOMSGS

Menekan semua pesan informasi.

Keterangan

Koreksi spesifik yang DBCC CHECKIDENT dilakukan pada nilai identitas saat ini bergantung pada spesifikasi parameter.

DBCC CHECKIDENT perintah Koreksi atau koreksi identitas yang dibuat
DBCC CHECKIDENT (<table_name>, NORESEED) Nilai identitas saat ini tidak diatur ulang. DBCC CHECKIDENT mengembalikan nilai identitas saat ini dan nilai maksimum kolom identitas saat ini. Jika kedua nilai tidak sama, reset nilai identitas untuk menghindari potensi kesalahan atau celah dalam urutan nilai.
DBCC CHECKIDENT (<table_name>)

or

DBCC CHECKIDENT (<table_name>, RESEED)
Jika nilai identitas saat ini untuk sebuah tabel kurang dari nilai identitas maksimum yang disimpan di kolom identitas, resetnya DBCC CHECKIDENT dengan menggunakan nilai maksimum di kolom identitas. Lihat bagian Pengecualian yang berikut ini.
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) Nilai identitas saat ini diatur ke new_reseed_value. Jika tidak ada baris yang dimasukkan ke dalam tabel sejak tabel dibuat, atau jika semua baris dihapus menggunakan TRUNCATE TABLE pernyataan, baris pertama yang dimasukkan setelah Anda menjalankan DBCC CHECKIDENT akan digunakan new_reseed_value sebagai identitas. Jika baris ada di tabel, atau jika semua baris dihapus menggunakan DELETE pernyataan, baris berikutnya yang dimasukkan menggunakan new_reseed_value + nilai kenaikan saat ini . Jika sebuah transaksi menyisipkan baris dan kemudian dikembalikan, baris berikutnya yang dimasukkan menggunakan new_reseed_value + nilai kenaikan saat ini seolah-olah baris tersebut dihapus. Jika tabel tidak kosong, mengatur nilai identitas ke angka yang kurang dari nilai maksimum di kolom identitas dapat mengakibatkan salah satu kondisi berikut:

- Jika kendala atau PRIMARY KEYUNIQUE ada pada kolom identitas, pesan kesalahan 2627 akan dihasilkan pada operasi sisipan selanjutnya ke dalam tabel karena nilai identitas yang dihasilkan bertentangan dengan nilai yang sudah ada.

- Jika constraint a PRIMARY KEY or UNIQUE tidak ada, operasi sisipan selanjutnya menghasilkan nilai identitas duplikat.

Pengecualian

Tabel berikut ini mencantumkan kondisi ketika DBCC CHECKIDENT tidak secara otomatis mengatur ulang nilai identitas saat ini, dan menyediakan metode untuk mengatur ulang nilai.

Kondisi Mereset metode
Nilai identitas saat ini lebih besar dari nilai maksimum dalam tabel. Jalankan DBCC CHECKIDENT (<table_name>, NORESEED) untuk menentukan nilai maksimum saat ini dalam kolom. Selanjutnya, tentukan nilai tersebut sebagai new_reseed_value dalam DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) perintah.

or

Jalankan DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) dengan new_reseed_value diatur ke nilai rendah, lalu jalankan DBCC CHECKIDENT (<table_name>, RESEED) untuk memperbaiki nilai.
Semua baris dihapus dari tabel. Jalankan DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) dengan new_reseed_value diatur ke nilai awal baru.

Mengubah nilai seed

Nilai seed adalah nilai yang dimasukkan ke dalam kolom identitas untuk baris pertama yang dimuat ke dalam tabel. Semua baris berikutnya berisi nilai identitas saat ini ditambah nilai kenaikan di mana nilai identitas saat ini adalah nilai identitas terakhir yang dihasilkan untuk tabel atau tampilan.

Anda tidak dapat menggunakan DBCC CHECKIDENT untuk tugas-tugas berikut:

  • Ubah nilai awal asli yang ditentukan untuk kolom identitas saat tabel atau tampilan dibuat.

  • Reseed baris yang sudah ada dalam tabel atau tampilan.

Untuk mengubah nilai seed asli dan mengubah baris yang ada, letakkan kolom identitas dan buat ulang untuk menentukan nilai seed baru. Saat tabel berisi data, nomor identitas ditambahkan ke baris yang ada dengan nilai benih dan kenaikan yang ditentukan. Urutan di mana baris diperbarui tidak dijamin.

Tataan hasil

Apakah Anda menentukan opsi apa pun untuk tabel yang berisi kolom identitas, DBCC CHECKIDENT mengembalikan pesan berikut untuk semua operasi kecuali satu. Operasi tersebut menentukan nilai seed baru.

Memeriksa informasi identitas: nilai identitas saat ini '<nilai> identitas saat ini', nilai kolom saat ini '<nilai> kolom saat ini'. Eksekusi DBCC selesai. Jika DBCC mencetak pesan kesalahan, hubungi administrator sistem Anda.

Ketika DBCC CHECKIDENT digunakan untuk menentukan nilai seed baru dengan menggunakan RESEED <new_reseed_value>, pesan berikut dikembalikan.

Memeriksa informasi identitas: nilai identitas saat ini '<nilai> identitas saat ini'. Eksekusi DBCC selesai. Jika DBCC mencetak pesan kesalahan, hubungi administrator sistem Anda.

Izin

Pemanggil harus memiliki skema yang berisi tabel, atau menjadi anggota peran server tetap sysadmin , peran database tetap db_owner , atau peran database tetap db_ddladmin .

Azure Synapse Analytics memerlukan izin db_owner .

Contoh

J. Reset nilai identitas saat ini, jika diperlukan

Contoh berikut mengatur ulang nilai identitas saat ini, jika diperlukan, untuk tabel yang ditentukan di database.

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO

B. Melaporkan nilai identitas saat ini

Contoh berikut melaporkan nilai identitas saat ini untuk tabel yang ditentukan di database, dan tidak mengoreksi nilai identitas jika salah.

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO

C. Paksa nilai identitas saat ini ke nilai baru

Contoh berikut memaksa nilai identitas saat ini untuk AddressTypeID kolom dalam AddressType tabel menjadi nilai 10. Karena tabel sudah memiliki baris yang ada, baris berikutnya yang dimasukkan menggunakan nilai 11. Nilai identitas saat ini yang baru yang didefinisikan untuk kolom ditambah 1 adalah nilai kenaikan kolom.

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO

D. Mengatur ulang nilai identitas pada tabel kosong

Contoh berikut mengasumsikan identitas tabel dan (1, 1) memaksa nilai identitas saat ini untuk ErrorLogID kolom dalam ErrorLog tabel menjadi 1, setelah menghapus semua catatan dari tabel. Karena tabel tidak memiliki baris yang ada, baris berikutnya yang dimasukkan menggunakan nilai 1. Nilai identitas saat ini yang baru tanpa menambahkan nilai kenaikan yang didefinisikan untuk kolom setelah TRUNCATE, atau menambahkan nilai kenaikan setelah DELETE.

USE AdventureWorks2022;
GO
TRUNCATE TABLE dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 1);
GO
DELETE FROM dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 0);
GO

Berlaku untuk:Gudang di Microsoft Fabric

Menyebarkan ulang nilai identitas dari sebuah tabel di Fabric Data Warehouse. Gunakan DBCC CHECKIDENT setelah memasukkan nilai eksplisit untuk SET IDENTITY_INSERT menyelaraskan rentang identitas dan mencegah konflik dengan nilai yang dihasilkan otomatis di masa depan.

Artikel ini dan sintaksnya IDENTITY berbeda pada platform yang berbeda dari SQL Database Engine.

Konvensi sintaks transact-SQL

Sintaks

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

Argumen

table_name

Nama tabel yang akan di-reseed nilai identitasnya. Tabel harus berisi kolom identitas. Nama tabel dapat mencakup nama skema, seperti 'dbo.DimCustomer' atau '[dbo].[DimCustomer]'.

DISEMPURNAKAN ULANG

Kata kunci ini RESEED opsional, tetapi DBCC CHECKIDENT selalu melakukan operasi reseed. Menyertakan opsi atau menghilangkannya menghasilkan hasil yang sama.

Kata kunci menginstruksikan RESEED Database Engine untuk memindai semua rentang identitas yang digunakan dan yang dipesan serta mengatur nilai identitas berikutnya untuk menghindari konflik dengan nilai yang sudah ada. Dalam Fabric Data Warehouse, RESEED melakukan pemindaian sadar rentang di semua node komputasi terdistribusi untuk menentukan nilai berikutnya yang benar.

Keterangan

  • Dalam Fabric Data Warehouse, satu-satunya argumen yang DBCC CHECKIDENT mendukung adalah RESEED opsi, yang selalu dilakukan. Sistem secara otomatis menentukan rentang nilai identitas berikutnya yang benar berdasarkan data yang ada. Anda tidak dapat menentukan nilai reseed khusus.
  • Selalu jalankan DBCC CHECKIDENT setelah digunakan IDENTITY_INSERT untuk memasukkan nilai eksplisit. Operasi ini memastikan bahwa nilai yang dihasilkan otomatis di masa depan tidak bertabrakan dengan nilai yang dimasukkan secara manual.
  • Dalam Fabric Data Warehouse, menentukan kustom new_reseed_value tidak didukung. Mencoba memberikan nilai mengembalikan kesalahan berikut: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT memperoleh kunci yang dapat memblokir operasi DML dan DDL secara bersamaan. Untuk meminimalkan gangguan, jalankan perintah secara terpisah ketika proses lain tidak aktif menggunakan tabel.

Izin

Anda harus memiliki tabel tersebut atau memiliki ALTER izin di atas tabel tersebut.

Contoh

J. Reseed setelah memasukkan nilai sentinel

Setelah mengisi nilai sentinel dalam tabel dimensi dengan SET IDENTITY_INSERT, tanam ulang kolom identitas untuk mencegah nilai yang dihasilkan otomatis di masa depan bertabrakan dengan nilai yang disisipkan secara manual.

-- Insert sentinel values
SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName)
VALUES (-1, 'Unknown'),
       (-2, 'Not Applicable');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

-- Reseed to realign future identity values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);

B. Reseed setelah migrasi massal

Setelah memigrasikan data historis dengan nilai identitas eksplisit, tanam ulang tabel untuk memastikan baris baru menerima nilai yang tidak tumpang tindih dengan data yang dimigrasikan.

-- After migrating data with IDENTITY_INSERT
DBCC CHECKIDENT('dbo.DimProduct', RESEED);

-- Future inserts receive auto-generated values beyond the migrated range
INSERT INTO dbo.DimProduct (ProductName, Category)
VALUES ('New Widget', 'Hardware');

C. Menyemai ulang setelah COPY INTO dengan IDENTITY_INSERT

Setelah memuat data dengan COPY INTO while IDENTITY_INSERT is ON, reseed kolom identitas. COPY INTO opsi menimpa pengaturan tingkat sesi apa pun untuk IDENTITY_INSERT.

COPY INTO dbo.DimStore (StoreKey 1, StoreName 2, Region 3)
FROM 'https://storage.blob.core.windows.net/migration/dimstore.csv'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

-- Reseed after bulk load
DBCC CHECKIDENT('dbo.DimStore', RESEED);

D. Reseed tanpa kata kunci RESEED

Kata kunci ini RESEED opsional, tetapi DBCC CHECKIDENT selalu melakukan operasi reseed. Menyertakan opsi atau menghilangkannya menghasilkan hasil yang sama.

-- Reseed without the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore');

-- Reseed with the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore', RESEED);