Bagikan melalui


Menonaktifkan batasan kunci asing dengan pernyataan INSERT dan UPDATE

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)database SQL di Microsoft Fabric

Anda dapat menonaktifkan batasan kunci asing selama transaksi INSERT dan UPDATE di SQL Server dengan menggunakan SQL Server Management Studio atau Transact-SQL. Gunakan opsi ini jika Anda tahu bahwa data baru tidak akan melanggar batasan yang ada atau jika batasan hanya berlaku untuk data yang sudah ada di database.

Pembatasan dan batasan

Setelah Anda menonaktifkan batasan ini, sisipan atau pembaruan di masa mendatang ke kolom tidak akan divalidasi terhadap kondisi batasan.

Izin Penggunaan

Memerlukan izin ALTER pada tabel tersebut.

Menggunakan SQL Server Management Studio

Untuk menonaktifkan batasan kunci asing untuk pernyataan INSERT dan UPDATE

  1. Di Object Explorer, perluas tabel dengan batasan lalu perluas folder Kunci .

  2. Klik kanan batasan dan pilih Ubah.

  3. Di kisi di bawah Perancang Tabel, pilih Terapkan Pembatasan Kunci Asing dan pilih Tidak dari menu drop-down.

  4. Pilih Tutup.

  5. Untuk mengaktifkan kembali batasan saat diinginkan, balikkan langkah-langkah di atas. Pilih Berlakukan Batasan Kunci Asing dan pilih Ya dari menu drop-down.

  6. Untuk mengandalkan batasan dengan memeriksa data yang ada pada relasi kunci asing, pilih Periksa Data yang Ada saat Membuat atau Mengaktifkan Ulang dan pilih Ya dari menu drop-down. Ini akan memastikan agar batasan kunci asing dipercaya.

  • Jika Periksa Data yang Ada saat Pembuatan atau Dihidupkan Kembali diatur ke Tidak, kunci asing tidak memeriksa data yang ada saat dihidupkan kembali. Oleh karena itu, pengoptimal kueri tidak dapat mempertimbangkan potensi peningkatan performa. Kunci asing tepercaya direkomendasikan karena dapat digunakan untuk menyederhanakan rencana eksekusi dengan asumsi berdasarkan batasan kunci asing. Untuk memeriksa apakah kunci asing tepercaya dalam database Anda, lihat kueri sampel nanti di artikel ini.

Menggunakan Transact-SQL

Untuk menonaktifkan batasan kunci asing untuk pernyataan INSERT dan UPDATE

  1. Di Object Explorer, sambungkan ke instans Mesin Database.

  2. Pada bilah Standar, pilih Kueri Baru.

  3. Salin dan tempel contoh berikut ke dalam jendela kueri dan pilih Jalankan.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  4. Untuk mengaktifkan kembali batasan saat diinginkan, salin dan tempel contoh berikut ke jendela kueri dan pilih Jalankan.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  5. Verifikasi bahwa batasan di lingkungan Anda tepercaya dan diaktifkan. Jika is_not_trusted = 1, maka kunci asing tidak memeriksa data yang ada saat diaktifkan kembali atau dibuat ulang. Oleh karena itu, pengoptimal kueri tidak dapat mempertimbangkan potensi peningkatan performa. Kunci asing tepercaya direkomendasikan karena dapat digunakan untuk menyederhanakan rencana eksekusi dengan asumsi berdasarkan batasan kunci asing. Salin dan tempel contoh berikut ke dalam jendela kueri dan pilih Jalankan.

    SELECT o.name, fk.name, fk.is_not_trusted, fk.is_disabled
    FROM sys.foreign_keys AS fk
    INNER JOIN sys.objects AS o ON fk.parent_object_id = o.object_id
    WHERE fk.name = 'FK_PurchaseOrderHeader_Employee_EmployeeID';
    GO
    

    Anda harus mengatur batasan kunci asing ke tepercaya jika data yang ada dalam tabel mematuhi batasan kunci asing. Untuk menjadikan batasan kunci asing tepercaya, gunakan skrip berikut untuk kembali mempercayai batasan kunci asing tersebut, sambil mencatat sintaks tambahan WITH CHECK. Salin dan tempel contoh berikut ke dalam jendela kueri dan pilih Jalankan.

    ALTER TABLE [Purchasing].[PurchaseOrderHeader] 
    WITH CHECK 
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;
    GO
    

Langkah berikutnya