Menentukan kekangan untuk mengawal integriti data. Kekangan integriti. Pandangan Data

"Sesuatu jadual atau paparan hanya boleh mempunyai satu kunci unik."
Rujukan Oracle9i SQL tentang mengehadkan penggunaan Kekangan Unik

Kenyataan yang dibentangkan sebagai epigraf diambil daripada dokumentasi Oracle, tetapi semua amalan sebelum membaca dokumentasi menunjukkan sebaliknya. Pengujian dengan mencipta sepasang Kekangan Unik mengesahkan ini. Terdapat ralat dalam dokumentasi.

Apa lagi (dengan harapan penerangan bebas ralat) boleh diperoleh daripada dokumentasi tentang Kekangan Integriti dalam Oracle? Saya cuba menulis pelbagai istilah dan ciri fungsi Kekangan integriti seperti jenis individu Objek pangkalan data Oracle tanpa pergi ke sintaks dan butiran penggunaannya. Banyak perkara baru kepada saya, saya tidak akan menyembunyikannya.

Mari kita mulakan dari awal - Keluaran Konsep Pangkalan Data Oracle9i 2 (9.2). Dokumentasi menyerlahkan konsep "Integriti Data", yang dikaitkan dengan pelaksanaan peraturan perniagaan yang dikaitkan dengan pangkalan data. Integriti Data dibahagikan kepada lima jenis peraturan, beberapa daripadanya dikuatkuasakan oleh "Kekangan Integriti" DBMS Oracle :

1. Peraturan NULL - BUKAN NULL sekatan;

2. nilai unik - sekatan kunci unik;

3. nilai kunci utama - kekangan kunci utama;

4. peraturan integriti rujukan - kekangan kunci asing (atau "kekangan integriti rujukan" - kedua-dua nama muncul dalam dokumentasi Oracle);

5. menyemak kekangan kompleks - Semak-kekangan.

(Di sini, di sebelah kiri sengkang ialah peraturan "Integriti Data" dan di sebelah kanan ialah jenis "Kekangan Integriti" yang melaksanakan peraturan ini)

Peraturan "Integriti Data" jenis keempat adalah komposit dan hanya sebahagiannya dipastikan oleh "Kekangan Integriti":

1. menetapkan data bergantung kepada NULL apabila memadam data rujukan;

2. pemadaman lata data bergantung apabila memadam data rujukan;

3. serta ketiadaan sebarang tindakan ke atas data bergantung apabila menukar atau memadam data rujukan. (Di sini masih kurang jelas bagi saya dari segi perbezaan antara Restrict dan No Action. Mungkin salah seorang pembaca akan membantu menemui perbezaannya...)

Baki subjenis sedia ada bagi titik keempat "Integriti Data":

o menetapkan data bergantung kepada NULL apabila data rujukan berubah;

o melata perubahan dalam data bergantung apabila data rujukan berubah;

o menetapkan data bergantung kepada lalai apabila data rujukan ditukar atau dipadamkan;

Jenis peraturan Integriti Data yang tidak boleh dikuatkuasakan menggunakan jenis sedia ada"Kekangan integriti" boleh dilaksanakan menggunakan pencetus. Walau bagaimanapun, sebarang jenis peraturan "Integriti Data" boleh diatur menggunakan pencetus, cuma laluan ini lebih kompleks dan kurang produktif.

Selanjutnya, untuk ringkas dan di luar kebiasaan, saya akan menggunakan nama "Kekangan Integriti" dalam versi bahasa Inggeris (kaitan dengan nama Rusia yang disebutkan di atas, pada pendapat saya, adalah jelas), dan bukannya "Kekangan Integriti" saya akan menulis hanya Kekangan.

Jadi, UNIKkunciKekangan. Kekangan ini memerlukan setiap nilai dalam medan utama adalah unik. Konsep "nilai" di sini bermaksud nilai tertentu, dan nilai NULL ialah takrifan ini tidak layak, jadi satu, dua, atau bahkan semua medan dalam Kekangan Utama UNIK boleh menjadi NULL. Ini berbeza dengan kunci Kekangan Utama PRIMER, yang tidak membenarkan nilai NULL sama sekali.

Apabila membuat Kekangan Utama UNIK atau Kekangan Utama UTAMA, indeks unik dicipta secara tersirat pada medan jadual yang digunakan Kekangan ini. Walau bagaimanapun, jika indeks tertentu (tidak kira unik atau tidak unik) pada medan utama sudah digunakan, maka indeks itu akan digunakan sebaliknya ciptaan tersirat baru. Apabila Kekangan ini dipadamkan, indeks juga akan dipadamkan. Kekangan Unik yang dibuat dengan atribut DEFERRABLE (lihat di bawah) sentiasa menggunakan indeks bukan unik. Apabila Kekangan tersebut dialih keluar, indeks bukan unik kekal.

Kekangan Integriti Rujukan memerlukan kewujudan jadual induk (rujukan). Kekangan Utama UNIK atau Kunci utama Kekangan. Jika tiada Kekangan NOT NULL pada mana-mana medan yang disertakan dalam Kekangan Integriti Rujukan, dalam medan ini

nilai NULL dibenarkan, dan Kekangan Integriti Rujukan sedemikian akan dianggap betul.

  • Jika tiada indeks pada kunci asing. Kemudian, apabila kunci utama jadual induk dipadamkan atau ditukar, Oracle akan mengeluarkan kunci pada jadual anak di peringkat jadual, melepaskan kunci ini serta-merta selepas memperolehnya. Jika kunci asing ditakrifkan sebagai ON DELETE CASCADE , maka pemadaman rekod daripada jadual induk akan menghasilkan kunci subeksklusif kongsi pada jadual anak. Kunci kongsi pada keseluruhan jadual anak juga akan diperlukan apabila menukar medan tersebut dalam jadual induk yang dirujuk oleh medan dalam jadual anak. Kunci kongsi ialah baca sahaja, jadi tiada sisipan, pemadaman atau pengubahsuaian data dalam jadual anak akan tersedia sehingga transaksi pada jadual induk selesai.
  • Jika terdapat indeks pada kunci asing, maka tidak akan ada lagi kunci pada peringkat jadual, dan dengan sebarang pemadaman atau perubahan data dalam jadual induk, hanya rekod individu yang sepadan akan dikunci dalam jadual anak sehingga transaksi selesai (penguncian eksklusif pada peringkat baris).

SEMAKIntegritiKekangan. Dibenarkan pada satu atau lebih medan jadual dan memerlukan pemenuhan syarat tertentu BENAR atau TIDAK DIKENALI untuk setiap baris jadual sebagai hasilnya. Perlu diperhatikan bahawa UNKNOWN bermaksud... NULL! Dalam erti kata lain, jika di mana-mana (sekurang-kurangnya mengikuti dokumentasi Oracle yang sama) nilai NULL tidak sama dengan apa-apa, termasuk dirinya sendiri, maka di sini ia "berfungsi" sebagai BENAR. Ia lucu, bukan?

Keanehan:

  • Hanya ungkapan Boolean boleh digunakan;
  • anda tidak boleh menggunakan subqueries, fungsi SQL atau jujukan (saya tertanya-tanya mengapa?);
  • anda tidak boleh menggunakan SYSDATE, UID, USE R, USERENV, LEVEL, ROWNUM.

Bilangan Kekangan Integriti CHECK adalah tidak terhad, tetapi tertib penggunaannya tidak dapat diramalkan. Nah, apabila menggunakan literal rentetan atau fungsi SQL seperti TO_CHAR, TO_DATE, TO_NUMBER dengan parameter sokongan globalisasi sebagai argumen, Oracle menggunakan nilai lalai parameter ini pada peringkat pangkalan data. Nilai ini boleh ditimpa dalam Kekangan Integriti CHECK yang dihasilkan.

Semua Kekangan tersenarai yang dilaksanakan dalam Orac le membenarkan pelanggarannya pada peringkat pernyataan, iaitu, pertama kenyataan itu akan dilaksanakan sepenuhnya (walaupun ia menyentuh sekurang-kurangnya satu juta baris), dan kemudian semakan Kekangan akan bermula. Walaupun, semakan tertunda Sekatan adalah mungkin sehingga transaksi selesai (yang dibincangkan di bawah).

Mod TETAPKAN KEKANGAN.

Kenyataan SET CONSTRAINTS membuat Kekangan sama ada DITANGGUH atau SEGERA (DITANGGUH dan SEGERA rujuk pada atribut Kekangan, dibincangkan kemudian) untuk sebahagian daripada transaksi. pengendali ini boleh digunakan untuk menetapkan mod sama ada untuk senarai Sekatan atau untuk semua Sekatan (SEMUA). Tindakan pengendali ini berakhir dengan selesainya transaksi semasa, atau dengan permulaan tindakan pengendali lain yang serupa. Operator ini tidak tersedia dalam pencetus.

TETAPKAN KEKANGAN ... SEGERA mula-mula menyebabkan semakan untuk kehadiran Kekangan tertunda sebelum ini, dan kemudian Kekangan yang disebabkan oleh melaksanakan penyata dalam transaksi semasa dicetuskan. Sebarang pelanggaran Kekangan dalam proses sedemikian akan ditandakan oleh ralat, dan apabila COMMIT dicapai, ia akan dipanggil rollback penuh transaksi semasa. Pernyataan ALTER SESSION juga boleh mempunyai ungkapan SET CONSTRAINTS, tetapi hanya untuk semua Constraints (ia tidak boleh disenaraikan dalam senarai). Ini bersamaan dengan melaksanakan pernyataan SET CONSTRAINTS pada awal setiap transaksi.

Melaksanakan KEKANGAN SET ... Penyata SEGERA sejurus sebelum urus niaga selesai membolehkan anda menentukan kejayaan COMMIT yang akan datang dan mengelakkan penarikan balik yang tidak perlu.

Negeri Kekangan.

Anda boleh menggunakan kenyataan CREATE TABLE atau ALTER TABLE untuk menetapkan keadaan setiap Kekangan peringkat jadual menggunakan ungkapan berikut:

  • ENABLE menjamin bahawa semua input memenuhi Kekangan;
  • DISABLE membenarkan data input gagal memenuhi Kekangan;
  • SAHKAN memastikan bahawa semua data yang sudah ada dalam jadual sepadan dengan Kekangan;
  • NOVALIDATE membenarkan data yang sudah ada dalam jadual untuk tidak memenuhi Kekangan;

...dan gabungan mereka:

  • ENABLE VALIDATE adalah serupa dengan ENABLE dan menjamin bahawa semua rekod (kedua-duanya telah dimasukkan dan disisipkan) memenuhi Kekangan;
  • DAYAKAN NOVALIDATE memastikan bahawa Kekangan berpuas hati untuk semua data input, tetapi data yang sudah ada dalam jadual mungkin tidak memenuhi Kekangan;
  • DISABLE NOVALIDATE adalah serupa dengan DISABLE . Memuaskan Kekangan kedua-dua data input dan data yang telah tersedia dalam jadual tidak dijamin;
  • LUmpuhkan SAHKAN menyahdayakan Kekangan, mengalih keluar indeks di mana ia dibina dan melarang sebarang perubahan pada medan yang disertakan dalam Kekangan.

... dan sedikit tentang ciri aplikasi:

· ungkapan ENABLE membayangkan ENABLE VALIDDATE ;

· ungkapan DISABLE membayangkan DISABLE NOVALIDATE ;

· SAHKAN dan NOVALIDATE tidak membayangkan apa-apa tentang ENABLE dan DISABLE (katakan sahaja ia adalah bahagian bergantung pada ungkapan untuk ENABLE dan DISABLE );

· penciptaan dan pemadaman indeks telah disebutkan;

· Apabila menukar keadaan daripada NOVALIDATE kepada SAH, semua data dalam jadual disemak, yang boleh mengambil masa yang sangat lama. Sebaliknya, apabila menukar keadaan Kekangan daripada VALIDATE kepada NOVALIDATE, ia hanya "terlupa" bahawa data yang tersedia sekali memenuhi Kekangan;

· mengalihkan satu kekangan daripada keadaan ENABLE NOVALIDATE kepada keadaan ENABLE VALIDATE tidak menyekat operasi baca, tulis atau DDL lain; ia boleh dilakukan secara selari.

Dan nota penting terakhir.

  • Apabila membuat Kekangan, anda boleh menentukan sebagai atribut sama ada mungkin kemudian semasa urus niaga menetapkan cek tertunda (DITANGGUH) menggunakan penyataan SET KEKANGAN (lihat di atas) daripada Sekatan ini. Lalai adalah TIDAK DITANGGUH (apa maksudnya, saya fikir, adalah jelas). Selepas mencipta Kekangan, anda tidak boleh menukar nilai atribut yang ditetapkan kecuali dengan mencipta semula Kekangan, jadi "berfikir dua kali"!
  • INIT IALLY ialah atribut tambahan kepada DEFERRABLE, yang boleh ditindih oleh pernyataan SET CONSTRAINT (sekali lagi, lihat di atas), dan yang menentukan tingkah laku lalai apabila Kekangan dicetuskan. tetapkan atribut DITANGGUHKAN. Apabila membuat Kekangan, tetapan lalai ialah INIT IALLY IMMEDIATE , maka Kekangan akan dicetuskan setiap kali pernyataan berasingan dilaksanakan; jika INIT IALLY DEFERRED ditetapkan, Kekangan akan dicetuskan sehingga akhir setiap transaksi. NOT DEFERRABLE tidak memerlukan atribut tambahan sebegitu, kerana ia adalah INIT IALLY IMMEDIATE mengikut takrifan.
  • ekspresi RELY. Secara lalai, apabila menukar Kekangan (menggunakan kekangan ALTER TABLE atau MODIFY), ia ditetapkan kepada NORELY. Maksudnya ialah ini: Sekiranya Oracle mengambil kira Kekangan yang berada dalam keadaan NOVALIDATE untuk menulis semula pertanyaan? RELY mengaktifkan Kekangan sedia ada dalam mod (dokumentasi Rujukan SQL di sini menggunakan perkataan "mod", walaupun saya sudah digunakan kepada perkataan "negeri" dari Concepts, nampaknya menulis orang yang berbeza, terlupa untuk bersetuju dengan syarat) NOVALIDATE, yang akan membolehkan anda menulis semula pertanyaan yang sebaliknya boleh ditulis semula hanya dengan kekangan mod SAH. Macam itu. Butiran lanjut lain kali.
  • EXCEPTIONS INTO mentakrifkan skema dan jadual di mana ROWID yang melanggar Kekangan akan dimasukkan apabila keadaan (Kekangan)nya berubah. Jika anda tidak menyatakan skema dan nama jadual, ia akan menganggap bahawa anda ingin menggunakan jadual bernama EXCEPTIONS dalam skema semasa.
Itu sahaja. Untuk hari ini.

Integriti data ialah mekanisme untuk mengekalkan konsistensi pangkalan data dengan domain. DALAM model hubungan Terdapat dua keperluan integriti data asas yang ditakrifkan:

    integriti rujukan

    integriti perhubungan.

Integriti perhubungan.

Objek dunia sebenar diwakili dalam pangkalan data hubungan sebagai tuple beberapa hubungan. Keperluan untuk integriti perhubungan adalah seperti berikut:

Setiap tuple dalam mana-mana hubungan mestilah berbeza daripada setiap tuple lain dalam hubungan itu (iaitu, mana-mana hubungan mesti mempunyai kunci utama).

Agak jelas bahawa jika keperluan ini tidak dipenuhi (iaitu, tupel dalam hubungan yang sama tidak unik), maka pangkalan data mungkin menyimpan maklumat yang bercanggah tentang objek yang sama. Mengekalkan integriti entiti dipastikan melalui sistem pengurusan pangkalan data (DBMS). Ini dilakukan menggunakan dua sekatan:

    Apabila menambahkan rekod pada jadual, keunikan kunci utamanya diperiksa

    Menukar nilai atribut yang disertakan dalam kunci utama tidak dibenarkan.

Pautan integriti

Objek dunia nyata yang kompleks diwakili dalam pangkalan data hubungan sebagai tuple beberapa perhubungan normal yang saling berkaitan. Di mana:

    Hubungan antara perhubungan ini diterangkan dari segi kebergantungan fungsi.

    Untuk mencerminkan kebergantungan fungsi antara tupel hubungan yang berbeza, penduaan kunci utama satu hubungan (ibu bapa) kepada yang lain (anak) digunakan. Atribut yang merupakan salinan kunci perhubungan induk dipanggil kunci asing.

Untuk setiap nilai kunci asing yang muncul dalam hubungan anak, mesti ada tuple dalam hubungan induk dengan nilai kunci primer yang sama.

Biarkan, sebagai contoh, diberikan hubungan JABATAN ( N_DEPARTMENT, DEPARTMENT_NAME) dan PEKERJA ( N_PEKERJA, N_DEPARTMENT, NAMA PEKERJA), yang menyimpan maklumat tentang pekerja perusahaan dan jabatan tempat mereka bekerja. Hubungan DEPARTMENT dalam pasangan ini ialah hubungan induk, jadi kunci utamanya ialah "N_jabatan" hadir dalam hubungan anak PEKERJA. Keperluan integriti rujukan di sini bermakna jadual PEKERJA tidak boleh mengandungi tuple dengan nilai atribut "N_jabatan", yang tidak muncul dalam jadual JABATAN. Jika tiada nilai sedemikian dalam hubungan JABATAN, nilai kunci asing dalam hubungan PEKERJA dianggap tidak ditentukan.

Lazimnya, mengekalkan integriti rujukan juga merupakan tanggungjawab sistem pengurusan pangkalan data.

wujud dua strategi asas untuk mengekalkan integriti rujukan :

    MENYEKAT - tidak membenarkan melakukan operasi, yang membawa kepada pelanggaran integriti rujukan. Ini yang paling banyak strategi mudah, yang hanya memerlukan menyemak sama ada terdapat tupel dalam hubungan anak yang berkaitan dengan beberapa tupel dalam hubungan induk.

    CASCADE - membenarkan pelaksanaan operasi yang diperlukan, tetapi buat pindaan yang diperlukan dalam aspek lain untuk mengelakkan pelanggaran integriti rujukan dan mengekalkan semua sambungan sedia ada. Perubahan bermula dalam hubungan ibu bapa dan melata melalui hubungan anak. Terdapat satu kehalusan dalam melaksanakan strategi ini, iaitu hubungan anak itu sendiri boleh menjadi induk kepada beberapa hubungan ketiga. Dalam kes ini, mungkin juga perlu untuk melaksanakan beberapa strategi untuk sambungan ini, dsb. Jika mana-mana operasi lata (di mana-mana peringkat) tidak dapat dilakukan, maka perlu untuk meninggalkan operasi awal dan mengembalikan pangkalan data kepada keadaan asalnya. Ini adalah strategi yang paling kompleks, tetapi perkara yang baik ialah ia tidak memutuskan hubungan antara tupel hubungan ibu bapa dan anak.

Kunci utama dan asing

Memandangkan hubungan ialah satu set, dan set mengikut takrifan tidak mengandungi unsur yang sepadan, tiada dua tupel sesuatu hubungan boleh menjadi pendua antara satu sama lain dalam sebarang cara sewenang-wenangnya. masa ini masa. Biarkan R ialah hubungan dengan atribut A1, A2, ..., An. Set atribut K=(Ai, Aj, ..., Ak) bagi hubungan R dikatakan sebagai kunci kemungkinan R jika dan hanya jika dua syarat bebas masa dipenuhi:

    Keunikan: pada bila-bila masa, tiada dua tupel R berbeza mempunyai nilai yang sama untuk Ai, Aj, ..., Ak.

    Minimaliti: tiada satu pun atribut Ai, Aj, ..., Ak boleh dikecualikan daripada K tanpa melanggar keunikan.

Setiap hubungan mempunyai sekurang-kurangnya satu kunci yang mungkin kerana sekurang-kurangnya gabungan semua atributnya memenuhi syarat keunikan. Satu daripada kunci yang mungkin(dipilih secara rawak) diambil sebagai kunci utamanya. Baki kekunci yang mungkin, jika ada, dipanggil kekunci alternatif.

Perhubungan boleh mengandungi berbilang kunci. Salah satu kunci sentiasa diisytiharkan utama, nilainya tidak boleh dikemas kini. Semua kunci perhubungan lain dipanggil kunci yang mungkin.

Pelbagai objek domain, maklumat tentang yang disimpan dalam pangkalan data, sentiasa saling berkaitan antara satu sama lain. Hubungan sedemikian tercermin dalam pangkalan data hubungan data menggunakan kunci asing , menghubungkan beberapa perhubungan.

Definisi formal.

Biarkan hubungan itu diberikan. Kami akan memanggil subset atribut perhubungan kunci asing , Jika:

Komen. Kunci asing, seperti kunci yang mungkin, boleh menjadi mudah atau gabungan.

Komen. Kunci asing mesti ditakrifkan pada domain yang sama dengan kunci utama yang sepadan bagi perhubungan induk.

Komen. Kunci asing biasanya tidak mempunyai sifat keunikan. Beginilah sepatutnya, kerana... hubungan anak boleh mempunyai berbilang tupel merujuk tupel yang sama dalam hubungan induk. Ini, sebenarnya, memberikan jenis hubungan "satu-ke-banyak".

Komen. Kunci asing tidak memerlukan ia menjadi komponen beberapa kunci calon.

Di atas dan beberapa konsep matematik lain adalah asas teori untuk penciptaan DBMS hubungan, membangunkan alat bahasa dan sistem perisian yang sesuai yang memastikan prestasi tinggi mereka, dan mewujudkan asas teori reka bentuk pangkalan data. Walau bagaimanapun, bagi pengguna massa DBMS hubungan, persamaan tidak formal bagi konsep ini boleh digunakan dengan jayanya:

Perkaitan – Jadual (kadang-kadang Fail), Tuple – Baris (kadang-kadang Rekod), Atribut – Lajur, Medan.

7. Kekangan Integriti

Kekangan integriti dalam pangkalan data, tujuan, integriti domain, integriti entiti, integriti rujukan, integriti deklaratif dan prosedur, pengendalian ralat dalam pelanggaran integriti

7.1 Apakah kekangan integriti

Kekangan integriti boleh ditakrifkan sebagai cara khas dalam pangkalan data, tujuan utamanya adalah untuk menghalang data yang tidak sah daripada memasuki pangkalan data (contohnya, untuk mengelakkan ralat pengguna semasa memasukkan data).

Pertama, sedikit teori.

Semua kekangan integriti boleh dibahagikan kepada tiga kategori besar:

· kategori pertama - cara memastikan integriti domain. Mereka bertanggungjawab untuk memastikan bahawa medan pangkalan data yang sepadan mengandungi nilai yang sah. Sebagai contoh, nama keluarga, sebagai peraturan, harus terdiri daripada huruf, dan poskod- daripada nombor. Dalam pangkalan data, integriti sedemikian biasanya dipastikan oleh syarat pada nilai, larangan nilai kosong, pencetus dan prosedur tersimpan, serta kunci;

· kategori ketiga - integriti rujukan, dipastikan oleh sistem kunci utama dan asing. Sebagai contoh, menggunakan alat ini kita boleh memastikan bahawa kita tidak mempunyai pesanan yang dibuat untuk pelanggan yang tiada dalam pangkalan data.

Terdapat dua lagi kategori besar di mana cara memastikan integriti boleh dibahagikan - cara yang bersifat deklaratif dan prosedur. Cara deklaratif dicipta sebagai komponen objek apabila ia ditakrifkan dalam pangkalan data (contohnya, syarat pada nilai apabila mentakrifkan jadual dalam pangkalan data). Alat prosedur (pencetus dan prosedur tersimpan) dilaksanakan secara berasingan modul perisian. Secara amnya, kekangan deklaratif kurang berfungsi tetapi lebih cekap sumber dan sebaliknya.

Harus dikatakan bahawa kehadiran sistem kekangan integriti yang dibangunkan sebahagian besarnya menentukan kematangan pangkalan data. Ia biasanya lebih mudah untuk segera memastikan bahawa nilai yang salah tidak memasuki pangkalan data daripada mengeluarkannya daripada pangkalan data kemudian.

Selain itu, apabila membuat kekangan integriti, pembangun mesti memastikan bahawa ralat yang berlaku akibat pelanggaran integriti ditangkap oleh aplikasi klien.

Harta (C) - konsistensi transaksi ditentukan oleh kehadiran konsep konsistensi pangkalan data.

Definisi 2. Kekangan Integriti ialah beberapa pernyataan yang boleh benar atau salah bergantung pada keadaan pangkalan data.

Definisi 3. Pangkalan data terletak di keadaan tekal (integral). , jika semua kekangan integriti yang ditakrifkan untuk pangkalan data dipenuhi (berpuas hati).

Bersama-sama dengan konsep integriti pangkalan data datang konsep reaksi sistem terhadap percubaan untuk melanggar integriti . Sistem bukan sahaja mesti menyemak sama ada kekangan dilanggar semasa pelaksanaan pelbagai operasi, tetapi juga untuk bertindak balas dengan sewajarnya jika operasi itu membawa kepada pelanggaran integriti. Terdapat dua jenis tindak balas terhadap percubaan untuk melanggar integriti:

- Penolakan melakukan operasi "haram".

Prestasi memberi pampasan tindakan.

17.3. Klasifikasi kekangan integriti.

Kekangan integriti boleh dikelaskan dalam beberapa cara:

  • Dengan kaedah pelaksanaan.
  • Mengikut masa cek.
  • Mengikut skop.

17.3.1. Klasifikasi kekangan integriti mengikut kaedah pelaksanaan

Setiap sistem mempunyai cara tersendiri untuk menyokong kekangan integriti. Terdapat dua kaedah pelaksanaan:

  • Sokongan deklaratif untuk kekangan integriti.
  • Sokongan prosedur untuk kekangan integriti.

Definisi 4. Sokongan deklaratif untuk kekangan integriti terdiri dalam mentakrifkan sekatan menggunakan Bahasa Definisi Data (DDL). Biasanya, sokongan integriti deklaratif (jika tersedia dalam DBMS) mentakrifkan sekatan pada domain dan nilai atribut, integriti entiti (kunci perhubungan berpotensi) dan integriti rujukan (integriti kunci asing). Kekangan integriti deklaratif boleh digunakan semasa membuat dan mengubah suai jadual menggunakan DDL atau sebagai pernyataan berasingan (ASSERTION).

Definisi 5. Sokongan prosedur untuk kekangan integriti adalah menggunakan pencetus dan prosedur tersimpan.

Tidak semua kekangan integriti boleh dilaksanakan secara deklaratif. Pada asasnya, kehadiran kekangan integriti (kedua-dua deklaratif dan prosedur) Sentiasa membawa kepada penciptaan atau penggunaan beberapa kod program, melaksanakan sekatan ini. Perbezaannya terletak pada tempat kod tersebut disimpan dan cara ia dicipta.

17.3.2. Klasifikasi kekangan integriti mengikut masa pengesahan.

Berdasarkan masa pemeriksaan, sekatan dibahagikan kepada:

  • Kekangan yang boleh disahkan serta-merta.
  • Kekangan dengan pemeriksaan tertunda.

Definisi 6. Kekangan yang boleh disemak serta-merta disemak serta-merta pada masa pelaksanaan operasi yang boleh melanggar kekangan. Sebagai contoh, keunikan kunci calon disemak apabila rekod dimasukkan ke dalam jadual. Jika kekangan dilanggar, maka operasi ditolak. Urus niaga di mana penegasan integriti yang boleh disahkan serta-merta telah dilanggar biasanya ditarik balik.



Definisi 7. Kekangan semakan tertunda disemak pada masa transaksi dilakukan oleh penyata COMMIT WORK. Dalam urus niaga, kekangan mungkin tidak dipenuhi. Jika pelanggaran kekangan cek tertunda dikesan pada masa transaksi dilakukan, urus niaga akan ditarik balik.

17.3.3. Klasifikasi kekangan integriti mengikut skop.

Mengikut skop, sekatan dibahagikan kepada:

  • Sekatan domain
  • Sekatan atribut
  • Kekangan Tuple
  • Batasan perhubungan
  • Had Pangkalan Data

17.3.3.1. Sekatan domain.

Definisi 8. Kekangan Integriti Domain mewakili sekatan yang digunakan hanya pada nilai domain yang sah. Malah, sekatan domain mesti menjadi sebahagian daripada definisi domain.

Menyemak kekangan. Sekatan domain itu sendiri tidak disemak. Jika atribut adalah berdasarkan domain, maka kekangan pada domain yang sepadan menjadi kekangan pada atribut tersebut.

17.3.3.2. Sekatan atribut.

Definisi 9. Kekangan integriti atribut mewakili sekatan yang diletakkan pada nilai yang dibenarkan bagi sesuatu atribut kerana atribut itu berdasarkan domain. Sekatan atribut adalah betul-betul sama dengan sekatan domain yang sepadan. Perbezaan antara kekangan atribut dan kekangan domain ialah kekangan atribut sedang diperiksa.

Menyemak kekangan. Kekangan atribut ialah serta-merta boleh disahkan had. Sememangnya, kekangan atribut tidak bergantung pada mana-mana objek pangkalan data lain selain daripada domain yang berasaskan atribut tersebut. Oleh itu, tiada perubahan pada objek lain boleh menjejaskan kebenaran kekangan.

17.3.3.3. Kekangan Tuple.

Definisi 10. Kekangan Integriti Tuple mewakili sekatan yang diletakkan pada nilai yang dibenarkan berasingan hubungan tupel, dan bukan menjadi kekangan integriti atribut. Keperluan yang dikenakan sekatan berasingan tuple hubungan bermaksud bahawa untuk menyemaknya tidak dikehendaki tiada maklumat tentang tupel lain dalam hubungan itu.

Menyemak kekangan. Pada masa kekangan tuple diperiksa, kekangan integriti atribut yang termasuk dalam tuple itu mesti diperiksa.

Kekangan tupel ialah serta-merta boleh disahkan had. Sesungguhnya, kekangan tuple tidak bergantung pada mana-mana objek pangkalan data lain selain daripada atribut yang merupakan sebahagian daripada tuple. Oleh itu, tiada perubahan pada objek lain boleh menjejaskan kebenaran kekangan.

17.3.3.4. Batasan sikap.

Definisi 11. Kekangan Integriti Perhubungan mewakili sekatan yang dikenakan hanya pada nilai yang dibenarkan berasingan perhubungan, dan bukan menjadi kekangan integriti tuple. Keperluan bahawa kekangan khusus untuk satu hubungan bermakna pengesahannya tidak memerlukan maklumat tentang hubungan lain (termasuk rujukan). oleh kunci asing kepada tupel sama perhubungan).

Menyemak kekangan. Pada masa kekangan hubungan diperiksa, kekangan integriti tupel hubungan mesti diperiksa.

Kekangan hubungan boleh seperti serta-merta boleh disahkan dengan cek tertunda.

Kekangan perhubungan yang merupakan kekangan kunci calon ialah kekangan yang boleh disahkan serta-merta.

Had ketersediaan pergantungan fungsi atribut juga merupakan kekangan yang boleh disemak serta-merta.

Sekatan yang ditakrifkan pergantungan berbilang nilai atau kebergantungan sambungan adalah kekangan semakan tertunda. Sesungguhnya, sekatan ini memerlukan tupel dimasukkan dan dikeluarkan keseluruhan kumpulan. Ini tidak boleh dilakukan dengan menyemak selepas setiap sisipan atau pemadaman tuple tunggal.

17.3.3.5. Had pangkalan data.

Definisi 12. Had Integriti Pangkalan Data mewakili sekatan yang dikenakan ke atas nilai dua atau lebih hubungan yang saling berkaitan (termasuk hubungan yang boleh dikaitkan dengan dirinya sendiri).

Menyemak kekangan. Pada masa kekangan pangkalan data diperiksa, kekangan integriti perhubungan mesti diperiksa.

Had pangkalan data mungkin seperti serta-merta boleh disahkan had dan had dengan cek tertunda.

Kekangan hubungan yang merupakan kekangan kunci asing boleh menjadi sama ada kekangan yang disahkan serta-merta atau kekangan tertunda.

Had Integriti Data membolehkan anda menambah keperluan untuknya yang merupakan tambahan kepada pematuhan jenis. Kekangan integriti yang diisytiharkan (skema, formal, "deklaratif") ditulis ("diisytiharkan") dalam bentuk syarat yang mesti dipenuhi jelas seperti itu, pada peringkat skema data, dan ini berbeza daripada peraturan integriti yang dirumuskan dalam bentuk semakan terprogram (lihat di bawah). Oleh itu, jika tidak, sekatan sedemikian boleh dipanggil "eksplisit". Istilah asal mempunyai nama penuh "kekangan data integriti" - "kekangan pada nilai data yang dikenakan untuk lebih perakaunan yang tepat keadaan bidang subjek ", tetapi sering dipendekkan kepada "kekangan integriti" atau malah hanya "kekangan". Perkataan "integriti" hampir tidak difahami dengan baik oleh ramai pembangun.

Konsep kekangan integriti yang diisytiharkan dalam SQL diwarisi daripada model hubungan dan menjadi lebih kompleks apabila standard dibangunkan. Dalam Oracle, tatanama kekangan integriti secara amnya sepadan dengan SQL -92 (walaupun skop pelaksanaan tidak dipenuhi), tetapi tidak dibawa ke tahap SQL:1999. Jadi, Oracle tidak membenarkan anda bermula kekangan integriti pada peringkat pangkalan data (menggunakan perkataan perkhidmatan ASSERTION ) dan sangat terhad dalam merumuskan syarat untuk menyemak nilai dengan konstruk CHECK kerana ia tidak membenarkan akses kepada data pangkalan data.

Perkataan ASSERTION daripada standard SQL mencadangkan satu lagi kekangan integriti terjemahan (dan pemahaman) sebagai "kekangan integriti afirmatif".

Kekangan integriti yang diisytiharkan dalam Oracle boleh ditetapkan pada tahap berikut:

  • medan baris berasingan dalam jadual;
  • baris berasingan;
  • sepasang meja.

Memeriksa pematuhan dengan kekangan integriti yang diisytiharkan semasa dilakukan oleh DBMS secara automatik dan sentiasa, tanpa mengira sumber perubahan, yang menjamin pematuhannya, berbeza dengan, katakan, pemeriksaan nilai input yang dijalankan oleh program aplikasi klien.

Oracle membenarkan anda untuk merumuskan sekatan tersebut apabila mencipta jadual dengan arahan CREATE TABLE, dan untuk jadual sedia ada ia boleh ditambah dan dibatalkan dengan arahan berikut:

  • ALTER JADUAL ... UBAHSUAI - menambah sekatan semua jenis dan mengalih keluar kekangan NOT NULL;
  • ALTER JADUAL ... ADD/DROP - menambah dan mengalih keluar sekatan semua jenis, kecuali NOT NULL .

Oracle memberikan nama kepada semua kekangan integriti yang dirumuskan dalam skema. Jika anda menggunakan binaan nama CONSTRAINT semasa membuat kekangan, kekangan akan menerima nama daripada pengaturcara, jika tidak DBMS akan mencipta nama mengikut budi bicaranya. Maklumat tentang masing-masing had sedia ada boleh didapati dalam jadual kamus rujukan USER_CONSTRAINTS dengan namanya. Nama kekangan yang tidak berjaya boleh ditukar; Sebagai contoh:

ALTER TABLE projx RENAME CONSTRAINT sys_c0011509 TO name_is_needed;

Jenis kekangan integriti yang diisytiharkan

BUKAN NULL kekangan

Kekangan NOT NULL memerlukan lajur atau kumpulan lajur untuk sentiasa mempunyai nilai (jika kumpulan, maka dalam sekurang-kurangnya satu medan). Keperluan bahawa lajur tidak kosong adalah sangat wajar, kerana ia melegakan pengaturcara daripada pelbagai kebimbangan yang berkaitan dengan keanehan pengendalian NULL. Malangnya, keperluan domain dan beberapa tindakan SQL (contohnya, GROUP BY ROLLUP ...) tidak membenarkan penghapusan sepenuhnya lajur dengan sifat NULL.

Ini adalah satu-satunya kekangan integriti yang disimpan bukan sahaja dalam jadual USER_CONSTRAINTS, tetapi juga dalam jadual USER_TAB_COLUMNS sebagai sifat lajur. (Pada satu masa, ciri NULL/NOT NULL secara rasmi dianggap sebagai sifat lajur, bukan kekangan integriti.) Atas sebab ini, penambahan dan penyingkiran sekatan ini diformalkan mengikut peraturan untuk menukar sifat lajur, hanya melalui kata kunci UBAHSUAI:

ALTER TABLE proj MODIFY (belanjawan BUKAN NULL); -- mewujudkan kekangan dengan nama sistem; kurungan adalah pilihan ALTER TABLE proj MODIFY (bajet NULL); -- pemansuhan sekatan; kurungan adalah pilihan ALTER TABLE proj MODIFY (KEKANGAN belanjawan adalah_wajib BUKAN NULL); -- mencipta kekangan dengan nama yang ditentukan oleh pengaturcara

DALAM versi moden Kekangan NOT NULL bebas Oracle akan diformalkan secara teknikal sebagai kekangan CHECK dengan syarat semakan: bajet IS NOT NULL dan pada masa yang sama akan ditetapkan dalam USER_CONSTRAINTS dengan nilai NULLABLE = "Y" . Sifat NOT NULL yang terhasil daripada peraturan kunci utama hanya akan ditunjukkan dalam USER_CONSTRAINTS .

Kekunci utama

Lajur yang ditetapkan sebagai kunci utama dikehendaki mempunyai nilai dalam medan semua barisnya yang unik dan sentiasa ada (untuk kunci berbilang lajur, sekurang-kurangnya satu medan mesti mempunyai nilai). Contoh penciptaan dan pemadaman:

ALTER TABLE proj TAMBAH KUNCI UTAMA (projno, pname); -- buat kekangan (kunci utama berdasarkan dua lajur) dengan nama sistem ALTER TABLE proj DROP PRIMARY KEY; -- mengalih keluar kekangan ALTER TABLE proj ADD CONSTRAINT pk_proj PRIMARY KEY (projno); -- mencipta kekangan dengan nama yang ditentukan oleh pengaturcara

Nilai dalam medan kunci utama mesti sentiasa wujud.

Sesetengah jenis lajur tidak dibenarkan sebelum membentuk kunci utama (contohnya, LOB atau STAMP MASA DENGAN ZON MASA).

Keunikan nilai dalam lajur

Lajur yang ditetapkan sebagai unik dikehendaki mempunyai nilai dalam medannya pada semua baris adalah unik. Keunikan dalam SQL paling hampir dengan konsep "alternatif", "calon" atau hanya "kunci" dalam model hubungan.

Contoh ciptaan:

ALTER TABLE proj TAMBAH UNIK (pname);

Ambil perhatian bahawa lajur PNAME tidak membenarkan nilai yang hilang. Menurut standard SQL, keunikan dijejaki tersedia nilai lajur. Jika anda juga mengenakan kekangan pada lajur sedemikian

ALTER TABLE proj UBAHSUAI (nama p NOT NULL);

ia akan dapat memainkan peranan kunci dalam model hubungan dan diisytiharkan sebagai utama (dengan menggantikan dua kekangan: UNIK dan BUKAN NULL dengan satu KUNCI PRIMER ). Jika sekumpulan lajur diisytiharkan unik, berikannya dengan sifat kunci menggunakan SQL lebih rumit (keperluan sekurang-kurangnya satu nilai dalam kumpulan unik boleh diperlukan oleh kekangan borang CHECK ).

Satu lagi perbezaan antara kekangan keunikan dan kunci utama ialah beberapa yang pertama boleh dirumuskan dalam jadual, manakala yang terakhir hanya terdapat dalam bentuk tunggal. Oracle tidak menghalang pengisytiharan keunikan bukan sahaja untuk kumpulan lajur yang terputus-putus, tetapi juga untuk yang berganda. Rangkaian arahan berikut Tidak akan menyebabkan ralat:

UBAH JADUAL t TAMBAH KEKANGAN xx UNIK (a, b); -- Ralat!

Kunci asing

Lajur diisytiharkan kunci asing, dikehendaki untuk (a) merujuk kepada lajur jenis yang sama daripada jadual lain atau sama, dengan syarat destinasi ialah kunci utama atau kumpulan lajur yang unik, dan (b) menerima hanya nilai yang wujud pada masa ini dalam lajur destinasi. Contoh ciptaan:

ALTER TABLE proj ADD (NOMBOR ldept (2)) ; ALTER TABLE proj ADD FOREIGN KEY (ldept) RUJUKAN dept (deptno) ;

Mengikut peraturan kunci asing dalam lajur LDEPT Tidak nilai yang hilang adalah dilarang. Piawaian SQL memerlukan DBMS untuk menyemak pematuhan dengan nilai dalam lajur sasaran jadual sahaja tersedia nilai kunci asing; dengan kata lain, nilai dalam medan kunci asing mungkin tiada.

Beberapa kunci asing boleh ditakrifkan dalam jadual. Sebagai contoh, dalam pemodelan contoh jabatan pekerja yang lebih teliti, sebagai tambahan kepada kunci asing DEPTNO sedia ada bagi jadual EMP, lajur JOB boleh diisytiharkan sebagai kunci asing, menyebabkan ia merujuk jadual berasingan dengan huraian kerja.