Pemicu: Menciptakan dan Aplikasi. Memicu contoh pemicu MS SQL sederhana

Sudah banyak artikel di Internet memiliki tentang pemicu SQL tentang SQL, tetapi saya akan menambahkan satu lagi dengan contoh yang memadai untuk mengkonsolidasikan materi untuk mereka yang "dalam subjek" dan apa yang lebih baik untuk memahami materi kepada mereka yang baru mulai memahami "Zen SQL". Pada saat yang sama, dan buat diskusi tentang topik tersebut.

Segera buat reservasi bahwa pendapat saya hanya pendapat saya, kadang-kadang sangat tegas. Karena sejumlah alasan, perlu untuk bekerja dengan situs bermuatan tinggi dan aplikasi web yang kompleks.

Dari pekerjaan mereka, satu pengalaman berharga dilakukan - ikuti prioritas dan statistik. Apa artinya? Semuanya sederhana: Jika Anda memiliki blog dan ia memiliki 2-3-4-10012 juta pengunjung per hari, dan artikelnya hanya ditulis 1-2-3435 kali sehari (urutan besarnya kurang dari jumlah tampilan) , kemudian kecepatan melestarikan artikel (dan kompleksitas ini) relatif terhadap kecepatan indikasi artikel dapat kurang proporsional. Semakin banyak pertunjukan, pertunjukan adalah pertunjukan, dan bukan pelestarian artikel / halaman / tabel. Apa yang tidak berarti bahwa adalah mungkin untuk bersantai. Pelestarian artikel selama 3-5-10 detik di blog berada dalam kerangka kecukupan, tetapi generasi halaman selama lebih dari 2 detik (+ sementara skrip dan gaya dengan gambar akan memuat) - itu di ambang "Situs apa yang benar, saya membaca sesuatu yang lain", dan lebih buruk lagi, saya akan pergi membeli di tempat lain. "

Jika kita mengambil situs rata-rata dengan pemungutan suara / karma, komentar, halaman meter, dll., Maka banyak pengembang muncul di benak desain seperti pilih Hitungan (*) dari komentar di mana comment.page \u003d page_id. Nah, pikirkan setiap artikel untuk menghitung jumlah peringkat, jumlah komentar. Dan kami memiliki artikel utama kami dari setiap bagian. Ketika kehadiran di 10 orang per detik, rata-rata VPS, Anda dapat mengizinkan diri sendiri 60-100 SQL kueri per halaman (Halo, Bitrix).

Tetapi untuk lirik line (sudah ditarik, mungkin). Data telanjang:

Blog meja.

Buat tabel jika tidak ada `blog` (id` int (11) bukan null auto_increment,` title` varchar (128) bukan nol, `teks` teks bukan ,` creation` dateTime bukan , `modifikasi` bukan , 'img` varchar (128) bukan nol default "default.png", `status` tinyint (4) tidak nol default" 2 ",` user_id` int (11) bukan , `tingkat` int (11) bukan , `relax_type` tinyint (4) bukan ,` timer` timestamp tidak nol default arus_timestamp, `kontes` tinyint (1) tidak nol default" 0 ",` views` int (11) bukan nol default "0", `comment` 0 " int (11) bukan , `url` varchar (128) bukan nol, kunci primer (` id`), URL` URL` (`url`), kunci` country_id` (` country_id`), kunci` user_id`), key_id ` (`user_id`), kunci` status` (`status`)) engine \u003d Innodb default charset \u003d utf8 auto_increment \u003d 1456435;

Komentar Tabel

Buat tabel jika tidak ada `Komentar` (` owner_name` varchar (50) bukan nol, `owner_id` int (12) bukan ,` int (12) bukan null auto_increment, `parent_id` ,` user_id `Int (12) default ,` text`te, `creation` timestamp null default arus_timestamp,` status` int (1) nol default "0", kunci utama (`ID`), Key` Owner_Name `,` owner_id`), kunci `parent_id` (` parent_id`)) mesin \u003d myiSam default charset \u003d utf8 auto_increment \u003d 243254252;

Seperti yang Anda lihat, di tabel blog, setiap artikel memiliki konter komentar (bidang komentar).
Praktik sederhana:
1. Menambahkan komentar - Meningkatkan penghitung untuk blog
2. Dihapus / sembunyikan komentar - mengurangi konter.
Lakukan ini dalam kode yang nyaman dan kebiasaan, tetapi ada alat yang lebih nyaman - pemicu.

Jadi, kami memiliki 2 acara (sebenarnya 3): Membuat komentar dan penghapusan (peristiwa ketiga adalah perubahan statusnya ("Hapus", larangan, dll.).
Anggap saja pembuatan dan penghapusan, dan biarkan perubahan status menjadi pekerjaan rumah.

Dalam contoh ada satu fitur: komentar mungkin untuk beberapa jenis artikel.

Membuat komentar:

Buat Pemicu `Add_Count_Comment` setelah memasukkan` Komentar` untuk setiap baris Mulai // Pengguna dalam Akun Pribadi Saya mempertimbangkan berapa banyak komentar menulis Ubah User atur user.countcomment \u003d user.user_id; // tentukan apa yang dikomentari komentar dan segera tingkatkan penghitung dalam kasus tabel ini new.`owner_name`` apa "blog" kemudian perbarui `blog` set` blog`.`comment` \u003d` blog`comment` + 1 dari `blog` .id \u003d new.`owner_id`; Ketika "artikel" kemudian perbarui`rticle` set `artikel`.` Comment` \u003d `artikel`.` Komentar` + 1 Di mana `artikel` \u003d baru. Ketika "PopulatePlace" maka perbarui` populate_place` `populat_place`.` Comment` \u003d `populate_place`.` Komentar` + 1 Di mana `populate_place`.`id` \u003d new. KASUS AKHIR; // di sini kami memfasilitasi pekerjaan Anda dengan pita berita // artikel URL Anda segera menulis, sehingga kemudian tidak membuat sampel kasus yang tidak perlu new.`owner_name` ketika "blog" kemudian seterurl \u003d (pilih url dari blog dari `blog` `. id \u003d new.`owner_id`); Ketika "artikel" kemudian mengatur uperurl \u003d (pilih URL dari `artikel` di mana artikel.id \u003d new.`owner_id`); Ketika "berupiah" lalu atur userurl \u003d ``; KASUS AKHIR; // Nama artikel itu segera menulis, jadi jika tidak membuat sampel kasus baru.`owner_name`` apa "blog" lalu atur userTitle \u003d (pilih judul dari `blog`wer_id`); Ketika "artikel" kemudian atur userTitle \u003d (pilih judul dari `artikel` di mana artikel.id \u003d new.`owner_id`); Ketika "berupah ditempatkan" maka atur usertitle \u003d ``; KASUS AKHIR; Masukkan ke Nilai User_Has_Events (New.User_ID, New.ID, "Komentar", sekarang (), Userurl, Usertitle); Akhir.

Demikian pula dan penghapusan komentar:

Buat pemicu `del_count_comment` setelah menghapus` Komentar` untuk setiap baris mulai memperbarui set pengguna user.countcomment \u003d user.countcomment -1 di mana user.id.user_id; Kasus Old.`Owner_Name` apa "blog" lalu perbarui `blog` set` blog`.`comment` (` blog`. `Komentar`-1 di mana`id`ed` \u003d old.wearner_id`; Ketika "Pasal" Lalu Update` dari Article` mengatur `article`.` Comment` ( `Article`.` Comment`-1 Dimana `article`.`id` \u003d old.`id` Ketika "beruputuk" maka perbarui` populat_place` set `populat_place`.`comment` \u003d` populate_place`. `Komentar`-1 Di mana` populate_place`.`id` \u003d old.`Ondrace KASUS AKHIR; Akhir.

Jadi apa yang didapat:
1. Saat memasukkan komentar, kami secara otomatis digunakan oleh SQL Server, jumlah komentar pada objek komentar tertentu (artikel, halaman, catatan)
2. Kami telah membentuk umpan berita (Halo ke semua jejaring sosial, dll.)
3. Ketika komentar dihapus, kami memiliki pengurangan semua data.
4. Kami tidak menggunakan kerangka kerja.
5. Sampel semua data yang diperlukan terjadi dengan cepat (hanya 1 permintaan ketika halaman ditampilkan, dengan pengecualian data "kiri" lainnya di atasnya.)

Dan kami memiliki sphinx yang secara berkala membuat sampel artikel yang telah berubah pada menit terakhir. Untuk melakukan ini, blog memiliki bidang modifikasi.

Pemicu tambahan:

Buat pemicu `ins_blog` sebelum memasukkan` blog` // buat penyisipan sebelum menyimpan informasi dengan "substitusi" data. Untuk setiap baris mulai set baru.modifikasi \u003d sekarang (); Akhir.

Sekarang membuat sampel untuk menit terakhir kami akan mendapatkan semua dokumen yang telah ditambahkan untuk menit terakhir.

Buat pemicu `ins_blog` sebelum memperbarui di` blog` // buat penyisipan sebelum menyimpan informasi dengan" substitusi "data. Untuk setiap baris mulai set baru.modifikasi \u003d sekarang (); Akhir.

Saat mengubah data, saya akan memperbarui indeks pencarian juga.

Biasanya, proyek rata-rata, semua yang dapat ditransfer ke sisi SQL Server ditransfer. SQL Server sendiri membuat operasi seperti itu lebih cepat dan dengan sumber daya yang lebih kecil daripada yang dapat dilakukan melalui bahasa pemrograman yang digunakan.

UPD: Cholivar yang dikhususkan untuk kelayakan komplikasi dari struktur DB dinyatakan terbuka.

Pelatuk:

<Определение_триггера>:: \u003d (buat | ubah) Nama trigger_trigger pada (name_table | nama cetak) ((untuk | setelah | alih-alih) ([hapus] [,] [,] [dengan menambahkan] [tanpa untuk Replikasi] sebagai operator SQL_ [... n]) | ((untuk | setelah | bukan) ([,]) [dengan menambahkan] [bukan untuk replikasi] [(jika memperbarui) memperbarui (dan | range_name)] [ .. n] | jika (koloms_updates () (operator_bit_purpace) bit_maska_imament) (operator_bit_sob) bit_mask [... n]) sql_ operator [... n]))

Pemicunya hanya dapat dibuat dalam database saat ini, tetapi dibiarkan bersirkulasi dalam pemicu ke database lain, termasuk terletak di server jarak jauh.

Pertimbangkan pengangkatan argumen dari create | Alter pemicu.

Nama pemicu harus unik dalam database. Selain itu, Anda dapat menentukan nama pemiliknya.

Ketika menentukan argumen enkripsi, server mengenkripsi kode pemicu sehingga tidak ada, termasuk administrator, tidak dapat mengaksesnya dan membacanya. Enkripsi sering digunakan untuk menyembunyikan algoritma pemrosesan data hak cipta, yang merupakan kekayaan intelektual dari seorang programmer atau rahasia komersial.

Jenis pemicu

Di SQL Server, ada dua parameter yang menentukan perilaku pemicu:

  • Setelah. Pemicunya dilakukan setelah berhasil melaksanakan perintahnya. Jika perintah untuk alasan apa pun tidak dapat berhasil diselesaikan, pemicu tidak dijalankan. Perlu dicatat bahwa data berubah sebagai akibat dari pelaksanaan permintaan pengguna dan eksekusi pemicu dilakukan dalam tubuh transaksi tunggal: Jika rollback pemicu terjadi, dan perubahan pengguna akan ditolak. Anda dapat mendefinisikan beberapa aftertriger untuk setiap operasi (menyisipkan, memperbarui, menghapus). Jika tabel disediakan untuk eksekusi beberapa aftertriger, menggunakan sistem SP_SETTRIGGEROTER yang disimpan prosedur, Anda dapat menentukan mana yang akan dilakukan terlebih dahulu dan apa yang terakhir. Secara default di SQL Server, semua pemicu adalah setelah pemicu.
  • Dari pada. Pemicunya disebut bukannya pelaksanaan perintah. Berbeda dengan Afteradrigger, bukannya -Tata dapat didefinisikan baik untuk tabel dan untuk presentasi. Untuk setiap sisipan, operasi pembaruan, Anda hanya dapat menentukan satu, bukan -Trigger.

Pemicu membedakan jenis perintah yang mereka bereaksi.

Ada tiga jenis pemicu:

  • Sisipkan Pemicu - Mulai ketika Anda mencoba memasukkan data menggunakan perintah Sisipkan.
  • Perbarui Pemicu - Mulai ketika Anda mencoba mengubah data menggunakan perintah pembaruan.
  • Hapus Pemicu - Mulai saat mencoba menghapus data menggunakan perintah Delete.

Desain [Hapus] [,] [Sisipkan] [,] [Perbarui] dan Untuk | Setelah | Dari pada) ([,] Tentukan perintah mana yang bereaksi pemicu. Ketika itu membuatnya harus ditentukan setidaknya satu tim. Diizinkan menciptakan pemicumerespons dua atau ketiga tim.

Argumen dengan Append memungkinkan Anda membuat beberapa pemicu setiap jenis.

Untuk penciptaan pemicu Dengan bukan untuk argumen replikasi, dilarang untuk memulainya selama eksekusi modifikasi tabel mekanisme replikasi.

Desain sebagai SQL_ operator [... n] mendefinisikan satu set operator dan perintah SQL yang akan dieksekusi ketika pemicu dimulai.

Perlu dicatat bahwa sejumlah operasi tidak diizinkan di dalam pelatuk, seperti:

  • pembuatan, ubah dan hapus basis data;
  • memulihkan basis data cadangan atau log transaksi.

Eksekusi dari perintah-perintah ini tidak diizinkan, karena mereka tidak dapat dibatalkan jika transaksi memutar kembali di mana pemicu dilakukan. Larangan ini tidak mungkin memengaruhi fungsionalitas pemicu yang dibuat. Sulit untuk menemukan situasi seperti itu di mana, misalnya, setelah mengubah baris tabel, Anda harus mengembalikan cadangan log transaksi.

Pemrograman pemicu

Saat melakukan menambah perintah, ubah dan hapus catatan, server membuat dua tabel khusus: dimasukkan. dan dihapus.. Mereka mengandung garis string yang akan dimasukkan atau dihapus setelah menyelesaikan transaksi. Struktur tabel yang dimasukkan dan dihapus identik dengan struktur tabel yang dipicu ditentukan. Untuk setiap pemicu, satu set tabel dimasukkan dan dihapus dibuat, jadi tidak ada pemicu lain yang dapat mengaksesnya. Tergantung pada jenis operasi yang menyebabkan eksekusi pemicu, isi tabel yang dimasukkan dan dihapus dapat berbeda:

  • perintah Sisipkan - di tabel yang dimasukkan berisi semua garis yang digunakan pengguna untuk memasukkan ke dalam tabel; Tidak akan ada garis di meja yang dihapus; Setelah pemicu selesai, semua baris dari tabel yang dimasukkan akan pindah ke tabel sumber;
  • hapus perintah - di tabel yang dihapus akan berisi semua baris yang akan dilakukan pengguna untuk menghapus; Pemicunya dapat memeriksa setiap baris dan menentukan apakah penghapusannya diizinkan; Tabel yang dimasukkan tidak akan ada garis apa pun;
  • perbarui perintah - Saat mengeksekusi di tabel yang dihapus, ada nilai baris lama yang akan dihapus pada penyelesaian yang berhasil.

Pemicu (basis data)

Pelatuk (eng. pelatuk.) - Ini adalah prosedur tersimpan dari tipe khusus yang tidak disebabkan oleh pengguna secara langsung, dan eksekusi yang disebabkan oleh tindakan dengan memodifikasi data: dengan menambahkan Sisipkan, menghapus garis hapus dalam tabel yang ditentukan, atau dengan mengubah data pembaruan dalam kolom tertentu dari tabel database relasional yang ditentukan. Pemicu diterapkan untuk memastikan integritas data dan implementasi logika bisnis yang kompleks. Pemicu menjalankan server secara otomatis ketika Anda mencoba mengubah data di tabel yang terhubung. Semua modifikasi data yang diproduksi oleh mereka dianggap dilakukan dalam transaksi di mana tindakan telah dilakukan yang menyebabkan pemicu pemicu. Dengan demikian, dalam hal deteksi kesalahan atau gangguan integritas data, rollback transaksi ini dapat terjadi.

Momen pemicu mulai ditentukan dengan menggunakan kata kunci sebelum (pemicu mulai melakukan peristiwa terkait; misalnya, sebelum menambahkan perekaman) atau setelah (setelah acara). Jika pemicunya dipanggil sebelum acara, itu dapat membuat perubahan pada acara yang dimodifikasi oleh acara tersebut (tentu saja, asalkan peristiwa ini bukan untuk menghapus catatan). Beberapa DBMS memberlakukan pembatasan pada operator yang dapat digunakan dalam pemicu (misalnya, dapat dilarang membuat perubahan pada tabel di mana "menggantung" pemicu, dll.)

Selain itu, pemicu dapat diikat ke tabel, tetapi untuk representasi (tampilan). Dalam hal ini, dengan bantuan mereka, mekanisme "representasi yang diperbarui" diimplementasikan. Dalam hal ini, kata kunci sebelum dan sesuka hanya mempengaruhi urutan panggilan pemicu, karena peristiwa itu sendiri (hapus, masukkan atau pembaruan) tidak terjadi.

Di beberapa server, pemicu dapat dipanggil bukan untuk setiap catatan yang dapat dimodifikasi, tetapi sekali untuk mengubah tabel. Pemicu semacam itu disebut tablet.

Contoh (Oracle):

/ * Pemicu pada level tabel * / Buat atau ganti Pemicu DistrictUpdtrigger setelah pembaruan pada Distirt mulai masukkan ke dalam nilai info ( "Tabel" District "telah berubah"); Akhir;

Dalam hal ini, untuk perbedaan pemicu tabular, kata kunci tambahan diperkenalkan dari huruf kecil ketika menggambarkan pemicu garis. Di Oracle, ini adalah frasa untuk setiap baris.

/ * Pemicu pada level string * / Buat atau ganti Pemicu DistrictUpdtrigger setelah pembaruan di kabupaten untuk setiap baris mulai masukkan ke Nilai Info ( "Satu string di tabel" distrik "telah berubah"); Akhir;


Foundation Wikimedia. 2010.

  • Rumah tangga
  • Spektroskopi.

Tonton apa itu "pemicu (database)" dalam kamus lain:

    Presentasi (basis data) - Istilah ini memiliki arti lain, lihat presentasi. Presentasi (ENG. Lihat, lebih konsonan bukan nama standar "View", dalam programmer Slane sering digunakan sebagai pinjaman dari "Bind" Inggris, "Wikipedia

    Basis data hierarkis - Model hierarkis basis data terdiri dari objek dengan pointer dari objek induk hingga keturunan, menyambungkan informasi terkait bersama. Basis data hierarkis dapat diwakili sebagai pohon yang terdiri dari objek berbagai tingkatan. ... ... Wikipedia

    Basis data relasional - Basis data basis data relasional berdasarkan pada model data relasional. Kata "relasional" berasal dari bahasa Inggris. Hubungan. Database relasional digunakan untuk bekerja dengan database relasional. Penggunaan basis data relasional adalah ... ... Wikipedia

    Indeks (database) - Istilah ini memiliki nilai lain, lihat indeks. Indeks (Indeks Bahasa Inggris) Objek basis data dibuat untuk meningkatkan kinerja pencarian data. Tabel dalam database mungkin memiliki sejumlah besar garis yang disimpan di ... Wikipedia

    Kursor (basis data) - Istilah ini memiliki arti lain, lihat kursor (nilai). Referensi kursor ke area memori konteks [sumber tidak ditentukan 126 hari]. Dalam beberapa implementasi informasi logis informasi SQL (Oracle, ... ... Wikipedia

    Pemicu (nilai) - Pemicu (Eng. Pemicu dalam arti kata benda "doggy, kait, pemicu dalam pengertian umum, yang mengarah ke elemen dalam tindakan"; dalam arti kata kerja "akting"): Dalam istilahnya adalah awal dari wilayah ... ... Wikipedia

    Database Refactoring. - (eng. Refactoring basis data) Ini adalah perubahan sederhana dalam skema basis data, yang membantu meningkatkan proyeknya dengan memelihara semantik fungsional dan informasi. Dengan kata lain, konsekuensi dari basis data refactoring tidak bisa ... ... Wikipedia

    Database. - Minta "BD" diarahkan di sini; Lihat juga nilai-nilai lain. Database yang disajikan dalam bentuk objektif kombinasi bahan independen (artikel, perhitungan, peraturan, keputusan pengadilan dan bahan serupa lainnya), ... ... Wikipedia

    Desain basis data - Proses membuat skema basis data dan menentukan batasan integritas yang diperlukan. Isi 1 Tugas Desain Dasar Dasar ... Wikipedia

    Model data - Dalam teori basis data klasik, model data adalah teori formal presentasi dan pemrosesan data dalam sistem manajemen basis data (DBMS), yang mencakup setidaknya tiga aspek: 1) aspek struktur: Metode yang menggambarkan jenis dan .... .. Wikipedia.

Definisi pemicu diberikan, area penggunaannya, tempat dan peran pemicu dalam memastikan integritas data. Menggambarkan jenis pemicu. Buat operator, ubah, hapus pemicunya dipertimbangkan. Pemicu pemrograman diilustrasikan oleh contoh-contoh pembuatan pemicu untuk mengimplementasikan keterbatasan integritas dan mengumpulkan data statistik.

Pemicu definisi dalam standar bahasa SQL

Pemicu adalah salah satu varietas prosedur tersimpan. Eksekusi mereka terjadi ketika dieksekusi untuk tabel operator bahasa manipulasi data (DML). Pemicu digunakan untuk memverifikasi integritas data, serta untuk memutar kembali transaksi.

Pemicunya adalah prosedur SQL yang dikompilasi, eksekusi yang disebabkan oleh timbulnya peristiwa-peristiwa tertentu dalam basis data relasional. Penggunaan pemicu sebagian besar nyaman bagi pengguna basis data. Namun penggunaannya sering dikaitkan dengan biaya sumber daya tambahan pada operasi I / O. Dalam hal terjadi hasil yang sama (dengan biaya sumber daya yang jauh lebih sedikit) dapat dicapai dengan menggunakan prosedur tersimpan atau program aplikasi, penggunaan pemicu tidak tepat.

Pemicu - alat SQL Server khusus yang digunakan untuk menjaga integritas data dalam database. Dengan bantuan pembatasan integritas, aturan, dan nilai default, tidak selalu mungkin untuk mencapai tingkat fungsi yang diinginkan. Seringkali diperlukan untuk mengimplementasikan algoritma verifikasi data yang kompleks yang menjamin keakuratan dan kenyataannya. Selain itu, kadang-kadang diperlukan untuk melacak perubahan nilai tabel untuk mengubah data terkait dengan benar. Pemicu dapat dianggap sebagai semacam filter yang masuk ke dalam tindakan setelah melakukan semua operasi sesuai dengan aturan, nilai standar, dll.

Pemicunya adalah jenis khusus dari prosedur tersimpan yang menjalankan server secara otomatis ketika Anda mencoba mengubah data dalam tabel dengan pemicu yang terhubung. Setiap pemicu diikat ke tabel tertentu. Semua modifikasi data yang diproduksi oleh mereka diperlakukan sebagai satu transaksi. Dalam hal deteksi kesalahan atau gangguan integritas data, transaksi ini kembali. Dengan demikian membuat perubahan dilarang. Semua perubahan yang sudah dibuat oleh pemicu dibatalkan.

Membuat pemicu hanya pemilik basis data. Keterbatasan ini memungkinkan Anda untuk menghindari perubahan yang tidak disengaja dalam struktur tabel, metode komunikasi dengan objek lain, dll.

Pemicunya adalah agen yang sangat berguna dan pada saat bersamaan. Dengan demikian, dengan logika karyanya yang salah, Anda dapat dengan mudah menghancurkan seluruh basis data, sehingga pemicu harus sangat hati-hati debugged.

Berbeda dengan subprogramme yang biasa, pemicunya dikenakan secara implisit dalam setiap kasus trigger Event., Apalagi, dia tidak punya argumen. Membawanya beraksi kadang-kadang disebut peluncuran pemicu. Dengan bantuan pemicu, tujuan-tujuan berikut dicapai:

  • memeriksa kebenaran data yang dimasukkan dan melakukan pembatasan integritas data yang kompleks yang sulit jika umumnya dimasukkan dengan bantuan kendala integritas yang dipasang untuk tabel;
  • penerbitan peringatan yang menyerupai kebutuhan untuk melakukan tindakan tertentu ketika memperbarui tabel, diimplementasikan dengan cara tertentu;
  • akumulasi informasi audit dengan memperbaiki informasi tentang perubahan dan mereka yang telah menyelesaikannya;
  • dukungan replikasi.

Format utama dari perintah create trigger ditunjukkan di bawah ini:

<Определение_триггера>:: \u003d Buat Pemicu Nama_trigger Sebelum | Setelah<триггерное_событие> DI.<имя_таблицы> <тело_триггера>

memicu peristiwa Terdiri dari menyisipkan, menghapus dan memperbarui string di tabel. Dalam kasus terakhir untuk trigger Event. Anda dapat menentukan nama spesifik kolom tabel. Waktu pemicu mulai ditentukan dengan menggunakan kata kunci sebelum (pemicu mulai melakukan peristiwa yang terkait) atau setelah (setelah eksekusi mereka).

Tindakan yang dilakukan oleh pemicu ditetapkan untuk setiap baris (untuk setiap baris) yang dicakup oleh acara ini, atau hanya sekali untuk setiap peristiwa (untuk setiap pernyataan).

Penunjukan <список_старых_или_новых_псевдонимов> Mengacu pada komponen tersebut sebagai baris lama atau baru (lama / baru) atau tabel lama atau baru (tabel lama / tabel baru). Jelas bahwa nilai-nilai lama tidak berlaku untuk menyisipkan acara, dan yang baru - untuk acara penghapusan.

Tunduk pada penggunaan yang tepat, pemicu dapat menjadi mekanisme yang sangat kuat. Keuntungan utama dari keuntungan mereka adalah bahwa fungsi standar disimpan di dalam database dan secara konsisten diaktifkan setiap kali diperbarui. Ini dapat secara signifikan menyederhanakan aplikasi. Namun demikian, kerugian yang melekat dalam pemicu harus disebutkan:

  • kesulitan: Saat memindahkan beberapa fungsi, tugas-tugas desain, implementasinya dan administrasi rumit;
  • fungsi tersembunyi: Transfer bagian dari fungsi ke database dan simpan dalam bentuk satu atau lebih pemicu kadang-kadang menyebabkan persembunyian dari pengguna beberapa fungsi. Meskipun itu menyederhanakannya sampai batas tertentu, tetapi, sayangnya, itu dapat menyebabkan efek samping yang tidak direncanakan, berpotensi tidak diinginkan, dan berbahaya, karena dalam hal ini pengguna tidak dapat mengontrol semua proses yang terjadi dalam database;
  • dampak pada kinerja: Sebelum melakukan setiap perintah untuk mengubah status basis data DBMS, Anda harus memeriksa kondisi pemicu untuk mengetahui kebutuhan untuk memulai pemicu untuk perintah ini. Pelaksanaan perhitungan tersebut mempengaruhi kinerja keseluruhan DBMS, dan pada saat-saat beban puncak, penurunannya dapat sangat terlihat. Jelas, dengan peningkatan jumlah pemicu, biaya overhead yang terkait dengan peningkatan operasi tersebut.

Pemicu yang ditulis salah dapat menyebabkan masalah serius, seperti penampilan kunci "mati". Pemicu mampu memblokir banyak sumber daya untuk waktu yang lama, sehingga perhatian khusus harus dibayarkan untuk meminimalkan konflik akses.

Implementasi pemicu di MS SQL Server MS

Dalam implementasi DBMS MS SQL Server, operator pembuatan atau perubahan pemicu berikut digunakan:

<Определение_триггера>:: \u003d (buat | ubah) Nama trigger_trigger pada (name_name | view_name) ((untuk | setelah | bukannya) ([hapus] [,] [,] [,] [dengan menambahkan] [tanpa untuk replikasi ] Sebagai operator SQL_ [... n]) | ((untuk | setelah | bukan) ([,]) [dengan menambahkan] [bukan untuk replikasi] [(jika memperbarui) memperbarui (dan | range_name)] [.. . n] | Jika (koloms_updates () (operator_bit_purpace) bit_maska_imament) (operator_bit_sob) bit_mask [... n]) sql_ operator [... n]))

Pemicunya hanya dapat dibuat dalam database saat ini, tetapi dibiarkan bersirkulasi dalam pemicu ke database lain, termasuk terletak di server jarak jauh.

Pertimbangkan pengangkatan argumen dari create | Alter pemicu.

Nama pemicu harus unik dalam database. Selain itu, Anda dapat menentukan nama pemiliknya.

Ketika menentukan argumen enkripsi, server mengenkripsi kode pemicu sehingga tidak ada, termasuk administrator, tidak dapat mengaksesnya dan membacanya. Enkripsi sering digunakan untuk menyembunyikan algoritma pemrosesan data hak cipta, yang merupakan kekayaan intelektual dari seorang programmer atau rahasia komersial.

Jenis pemicu

Di SQL Server, ada dua parameter yang menentukan perilaku pemicu:

  • Setelah. Pemicunya dilakukan setelah berhasil melaksanakan perintahnya. Jika perintah untuk alasan apa pun tidak dapat berhasil diselesaikan, pemicu tidak dijalankan. Perlu dicatat bahwa data berubah sebagai akibat dari pelaksanaan permintaan pengguna dan eksekusi pemicu dilakukan dalam tubuh transaksi tunggal: Jika rollback pemicu terjadi, dan perubahan pengguna akan ditolak. Anda dapat mendefinisikan beberapa aftertriger untuk setiap operasi (menyisipkan, memperbarui, menghapus). Jika tabel disediakan untuk eksekusi beberapa aftertriger, menggunakan sistem SP_SETTRIGGEROTER yang disimpan prosedur, Anda dapat menentukan mana yang akan dilakukan terlebih dahulu dan apa yang terakhir. Secara default di SQL Server, semua pemicu adalah setelah pemicu.
  • Dari pada. Pemicunya disebut bukannya pelaksanaan perintah. Berbeda dengan After -Trigger, bukannya -trigger dapat didefinisikan baik untuk tabel maupun untuk dilihat. Untuk setiap sisipan, operasi pembaruan, Anda hanya dapat menentukan satu, bukan -Trigger.

Pemicu membedakan jenis perintah yang mereka bereaksi.

Ada tiga jenis pemicu:

  • Sisipkan Pemicu - Mulai ketika Anda mencoba memasukkan data menggunakan perintah Sisipkan.
  • Perbarui Pemicu - Mulai ketika Anda mencoba mengubah data menggunakan perintah pembaruan.
  • Hapus Pemicu - Mulai saat mencoba menghapus data menggunakan perintah Delete.

Desain [Hapus] [,] [Sisipkan] [,] [Perbarui] dan Untuk | Setelah | Dari pada) ([,] Tentukan perintah mana yang bereaksi pemicu. Ketika itu membuatnya harus ditentukan setidaknya satu tim. Diizinkan menciptakan pemicumerespons dua atau ketiga tim.

Argumen dengan Append memungkinkan Anda membuat beberapa pemicu setiap jenis.

Untuk penciptaan pemicu Dengan bukan untuk argumen replikasi, dilarang untuk memulainya selama eksekusi modifikasi tabel mekanisme replikasi.

Desain sebagai SQL_ operator [... n] mendefinisikan satu set operator dan perintah SQL yang akan dieksekusi ketika pemicu dimulai.

Perlu dicatat bahwa sejumlah operasi tidak diizinkan di dalam pelatuk, seperti:

  • pembuatan, ubah dan hapus basis data;
  • memulihkan basis data cadangan atau log transaksi.

Eksekusi dari perintah-perintah ini tidak diizinkan, karena mereka tidak dapat dibatalkan jika transaksi memutar kembali di mana pemicu dilakukan. Larangan ini tidak mungkin untuk entah bagaimana memengaruhi fungsionalitas pemicu yang dibuat. Sulit untuk menemukan situasi seperti itu di mana, misalnya, setelah mengubah baris tabel, Anda harus mengembalikan cadangan log transaksi.

Pemrograman pemicu

Saat melakukan menambah perintah, ubah dan hapus catatan, server membuat dua tabel khusus: dimasukkan. dan dihapus.. Mereka mengandung garis string yang akan dimasukkan atau dihapus setelah menyelesaikan transaksi. Struktur tabel yang dimasukkan dan dihapus identik dengan struktur tabel yang dipicu ditentukan. Untuk setiap pemicu, satu set tabel dimasukkan dan dihapus dibuat, jadi tidak ada pemicu lain yang dapat mengaksesnya. Tergantung pada jenis operasi yang menyebabkan eksekusi pemicu, isi tabel yang dimasukkan dan dihapus dapat berbeda:

  • perintah Sisipkan - di tabel yang dimasukkan berisi semua garis yang digunakan pengguna untuk memasukkan ke dalam tabel; Tidak akan ada garis di meja yang dihapus; Setelah pemicu selesai, semua baris dari tabel yang dimasukkan akan pindah ke tabel sumber;
  • hapus perintah - di tabel yang dihapus akan berisi semua baris yang akan dilakukan pengguna untuk menghapus; Pemicunya dapat memeriksa setiap baris dan menentukan apakah penghapusannya diizinkan; Tabel yang dimasukkan tidak akan ada garis apa pun;
  • perbarui perintah - Saat mengeksekusi di tabel yang dihapus, ada nilai baris lama yang akan dihapus ketika pemicu berhasil diselesaikan. Nilai baris baru terkandung dalam tabel yang dimasukkan. Garis-garis ini akan ditambahkan ke tabel sumber setelah berhasil eksekusi pemicu.

Untuk informasi tentang jumlah baris, yang akan diubah ketika pemicu berhasil diselesaikan, Anda dapat menggunakan fungsi @@ rowcount; Ini mengembalikan jumlah baris yang diobati dengan perintah terakhir. Harus ditekankan bahwa pemicu diluncurkan tanpa mencoba mengubah string tertentu, dan pada saat menjalankan perintah perubahan. Salah satu tim tersebut memengaruhi serangkaian garis, sehingga pemicunya harus memproses semua baris ini.

Jika pemicunya menemukan bahwa dari 100 string yang dimasukkan, variabel atau dihapus, hanya satu yang tidak memuaskan satu atau yang lain, maka tidak ada string yang akan dimasukkan, diubah atau dihapus. Perilaku tersebut disebabkan oleh persyaratan transaksi - baik semua modifikasi atau siapa pun harus dilakukan.

Pemicunya dilakukan sebagai transaksi yang didefinisikan secara implisit, sehingga perintah kontrol transaksi diizinkan di dalam pelatuk. Secara khusus, ketika pelanggaran batasan integritas untuk mengganggu eksekusi pemicu dan pembatalan semua perubahan yang mencoba untuk melaksanakan pengguna, Anda harus menggunakan perintah transaksi rollback.

Untuk mendapatkan daftar kolom, dimodifikasi saat melakukan perintah INSERT atau UPDATE yang menyebabkan eksekusi pemicu, Anda dapat menggunakan fungsi kolom_updated (). Ini mengembalikan angka biner, masing-masing bit, dimulai dengan yang lebih muda, sesuai dengan satu kolom tabel (dalam urutan kolom saat membuat tabel). Jika bit diatur ke "1", kolom yang sesuai telah diubah. Selain itu, fakta mengubah kolom menentukan dan fitur pembaruan (library_name).

Untuk pemicu penghapusan Perintah bekas

Drop Trigger (Nametrigger) [, ... n]

Kami memberikan contoh penggunaan pemicu.

Contoh 14.1. Menggunakan pemicu untuk implementasi batasan. Dalam catatan ditambahkan ke tabel, jumlah barang yang dijual yang dijual seharusnya tidak kurang dari residu dari meja gudang.

Perintah entri dalam tabel transaksi mungkin, misalnya, seperti:

Masukkan ke dalam nilai transaksi (3.1, -299, "01/08/2002")

Pemicu yang dibuat harus menanggapi eksekusi sebagai berikut: perlu untuk membatalkan perintah jika nilai barang tetap kurang dari barang yang dijual dengan kode yang dimasukkan (dalam contoh kode produk \u003d 3). Dalam catatan penyisipan, jumlah barang diindikasikan dengan tanda "+", jika barang disediakan, dan dengan tanda "-", jika dijual. Pemicu yang disajikan dikonfigurasi untuk memproses hanya satu perekaman yang ditambahkan.

Buat pemicu pemicu pada deal untuk memasukkan seolah-olah @@ rowcount \u003d 1 Mulailah jika tidak ada (pilih * dari dimasukkan di mana -itted.4<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Contoh 14.1. Menggunakan pemicu untuk mengimplementasikan batasan nilai.

Contoh 14.2. Menggunakan pemicu untuk mengumpulkan data statistik.

Buat pemicu untuk memproses operasi insert entri ke tabel transaksi, misalnya, perintah seperti:

Masukkan ke dalam transaksi nilai (3,1.200, "01/08/2002")

barang lengkap dengan kode 3 dari klien dengan kode 1 dalam jumlah 200 unit.

Saat menjual atau mendapatkan barang, perlu untuk mengubah jumlah stok gudangnya. Jika belum ada produk dalam stok, Anda perlu menambahkan entri yang sesuai ke tabel gudang. Pemicu hanya memproses satu string yang ditambahkan.

Alter Trigger Trigger_ins pada transaksi untuk menyisipkan sebagai Declare @x int, @y int jika @@ rowcount \u003d 1 - Dalam transaksi tabel menambah perekaman - dengan pengiriman barang yang dijual tidak - hanya dari saldo Dari gudang meja jika tidak ada (pilih * dari dimasukkan di mana -inserted.number< =ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "откат товара нет " END --если записи о поставленном товаре еще нет, --добавляется соответствующая запись --в таблицу Склад IF NOT EXISTS (SELECT * FROM Склад С, inserted i WHERE С.КодТовара=i.КодТовара) INSERT INTO Склад (КодТовара,Остаток) ELSE --если запись о товаре уже была в таблице --Склад, то определяется код и количество --товара издобавленной в таблицу Сделка записи BEGIN SELECT @y=i.КодТовара, @x=i.Количество FROM Сделка С, inserted i WHERE С.КодТовара=i.КодТовара --и производится изменения количества товара в --таблице Склад UPDATE Склад SET Остаток=остаток[Dilindungi Email] Di mana codtowder. [Dilindungi Email] Ujung ujung. Contoh 14.2. Menggunakan pemicu untuk mengumpulkan data statistik.

Contoh 14.3. Buat pemicu untuk memproses operasi penghapusan rekaman dari tabel transaksi, misalnya, perintah seperti itu:

Untuk produk, kode yang ditentukan saat melepas catatan, perlu untuk menyesuaikan residunya di gudang. Pemicu memproses hanya satu entri jarak jauh.

Buat pemicu trigger_del pada hapus seolah-olah @@ rowcount \u003d 1 - satu mulai mendeklarasikan @y int, @ x int - menentukan kode dan jumlah barang dari tabel pilih @ y \u003d codovar, @ x \u003d kuantitas dari dihapus - di gudang tabel menyesuaikan jumlah - perbarui penyimpanan set residu \u003d residu [Dilindungi Email] Di mana codtowder. [Dilindungi Email] Akhir. Contoh 14.3. Memicu untuk memproses penghapusan rekaman dari tabel

Contoh 14.4. Buat pemicu untuk memproses operasi perubahan perekaman dalam tabel transaksi, misalnya, dengan perintah seperti itu:

dalam semua transaksi dengan produk yang memiliki kode sama dengan 3, mengurangi jumlah barang sebesar 10 unit.

Perintah yang ditentukan dapat menyebabkan perubahan dalam beberapa entri di tabel transaksi. Oleh karena itu, kami menunjukkan cara membuat pemrosesan pemicu bukan satu catatan. Untuk setiap perekaman yang diubah, perlu untuk mengurangi keseimbangan barang dalam stok dengan nilai nilai barang dalam stok dan untuk produk baru (setelah perubahan) produk terhadap nilai produk dan untuk yang baru ( Setelah berubah) dari kode produk untuk meningkatkan keseimbangannya dalam besarnya (setelah perubahan). Untuk menangani semua catatan yang diubah, masukkan kursor di mana Anda menyimpan semua lama (dari tabel yang dihapus) dan semua nilai baru (dari tabel yang dimasukkan).

Buat Pemicu Trigger_UPD pada Transaksi untuk Pembaruan Sebagai Declare @x int, @x_old int, @y_t int - cursor dengan nilai baru Kursor Cur1 untuk memilih codovar, kuantitas dari kursor deklare Cur2 yang lama untuk Pilih Codovar, Kuantitas dari Open Cur1 Open Cur2 - Pindahkan secara paralel pada kedua Fetch berikutnya dari Cur1 ke dalam kursor @x, @y fetch dari cur2 ke @x_old while @@ fetch_status \u003d 0 Begin - untuk kode produk lama Ini mengurangi - perolehan di gudang pembaruan stok set residu \u003d residu [Dilindungi Email]_old di mana Kodtower. [Dilindungi Email]_Dold - untuk kode produk baru, jika tidak ada produk tersebut dalam stok, catatan baru jika tidak ada dimasukkan (pilih * dari mana Kodtovar Warehouse [Dilindungi Email]) Masukkan ke gudang (codovar, residu) Nilai (@ x, @ y) lain -iner untuk kode produk baru meningkatkan jumlah dalam pembaruan stok gudang set residu \u003d residu [Dilindungi Email] Di mana codtowder. [Dilindungi Email] Ambil berikutnya dari cur1 ke @x, @y fetch selanjutnya dari cur2 inte @x_old, @y_old ujung tutup cur1 Tutup cur2 Dealocate Cur2 Contoh 14.4. Pemicu untuk pemrosesan perubahan perekaman di tabel

Dalam pemicu yang dianggap, tidak ada perbandingan jumlah barang ketika perubahan dalam catatan transaksi dengan residu di gudang.

Contoh 14.5. Mari kita perbaiki kekurangan ini. Untuk menghasilkan pesan kesalahan, gunakan perintah MS SQL Server RaisError di bodi pemicu, argumen yang merupakan teks pesan, tingkat keparahan dan status kesalahan.

Alter Trigger Trigger_Upd pada Transaksi untuk Pembaruan Sebagai Declare @x int, @ @y_t int, @ @ @ @y_old int, @ @ @y_old Int, @ Int Didlare Cur1 Cursor Untuk Pilih Codovar, Kuantitas dari SELECTED CODOVAR , Angka dari Open Cur1 Open Cur2 Fetch berikutnya dari cur1 ke @x, @y fetch dari cur2 ke @x_old, @y_old while @@ fetch_status \u003d 0 mulai pilih @ o \u003d residu dari tempat Kodtovar [Dilindungi Email] Jika @o.<[Dilindungi Email] Mulai RaisError ("Rangered", 16.10) Tutup Cur1 Cur2 Dealocate Cur1 Dealocate Cur22 Rollback Tran Return End Update Walke Set Pucat \u003d Residu [Dilindungi Email]_old di mana Kodtower. [Dilindungi Email]_old jika tidak ada (pilih * dari gudang codovar swasher [Dilindungi Email]) Masukkan ke gudang (codewood, residu) nilai (@ x, @ y) Pembaruan lain mengatur residu gudang \u003d residu [Dilindungi Email] Di mana codtowder. [Dilindungi Email] Ambil berikutnya dari cur1 ke @x, @y fetch selanjutnya dari cur2 inte @x_old, @y_old ujung tutup cur1 Tutup cur2 Dealocate Cur2 Contoh 14.5. Versi pemicu terkoreksi untuk pemrosesan perubahan rekaman di tabel

Contoh 14.6. Dalam contoh, pembatalan semua perubahan terjadi jika tidak mungkin untuk mewujudkan setidaknya satu dari mereka. Buat pemicu yang memungkinkan Anda untuk membatalkan hanya mengubah beberapa catatan dan melakukan perubahan dalam sisanya.

Dalam hal ini, pemicu dijalankan tidak setelah mengubah catatan, tetapi bukannya perintah perubahan.

Alter Trigger Trigger_UPD pada Transfer alih-alih pembaruan sebagai deklarasi @k int, @k_old int menyatakan @x int, @x_old int, @y int menyatakan @y_old int, @ o int menyatakan kursor Cur1 untuk kuantitas dari dimasukkan. Kursor Cur2 untuk Kode Pilih, Kodtovar, Kuantitas Deleted Open Cur1 Open Cur2 Fetch Selanjutnya dari cur1 ke @ k, @ x, @y fetch dari cur2 ke @ k_old, @ x_old, @ @ fetch_status \u003d 0 O \u003d Residu dari Wovel Kodtovar [Dilindungi Email] Jika @o\u003e [Dilindungi Email] Mulai RaisError ("Ganti", 16.10) Perbarui kuantitas set transaksi [Dilindungi Email], Kode Produk [Dilindungi Email] Wheredelka [Dilindungi Email] Perbarui gudang set residu \u003d residu [Dilindungi Email]_old di mana Kodtower. [Dilindungi Email]_old jika tidak ada (pilih * dari gudang codovar swasher [Dilindungi Email]) Masukkan ke gudang (codewood, residu) nilai (@ x, @ y) Pembaruan lain mengatur residu gudang \u003d residu [Dilindungi Email] Di mana codtowder. [Dilindungi Email] Akhir lain RaisError ("Record tidak berubah", 16.10) Ambil selanjutnya dari cur1 ke @ k, @ x, @y fetch dari cur2 ke @ k_old, @ x_old, @ yold end tutup Cur1 Dealocate Cur2 Contoh 14.6. Pemicu yang memungkinkan Anda untuk membatalkan hanya mengubah beberapa catatan dan melakukan perubahan dalam sisanya.

Ini berlaku untuk:SQL Server (mulai 2008) SQL Azure Pack SQL Azureparallel database gudang data

Membuat pemicu pemrosesan data, DDL atau input. Pemicunya adalah jenis prosedur tersimpan khusus yang dilakukan secara otomatis ketika suatu peristiwa terjadi pada server database. Pemicu pemrosesan data dijalankan oleh peristiwa yang disebabkan oleh upaya pengguna untuk mengubah data menggunakan bahasa pemrosesan data. Acara DML adalah memasukkan, pembaruan, atau hapus prosedur yang diterapkan pada tabel atau representasi. Pemicu ini dipicu ketika Anda memulai acara yang valid, terlepas dari apakah itu mempengaruhi baris tabel.

Pemicu DDL dipicu sebagai respons terhadap sejumlah bahasa deskripsi data (DDL). Peristiwa ini terutama mematuhi transaksi-SQL membuat, mengubah, instruksi drop dan beberapa toko sistem yang tampil mirip dengan operasi DDL. Pemicu input dapat dipicu sebagai respons terhadap peristiwa masuk yang terjadi selama instalasi sesi khusus. Pemicu dapat dibuat langsung dari instruksi Transact-SQL atau metode majelis yang dibuat di Microsoft .NET Framework perusahaan (CLR) dan transmisi ke instance SQL Server. SQL Server memungkinkan Anda untuk membuat beberapa pemicu untuk instruksi apa pun.

SQL Server Sintaks - Memicu pada Pernyataan Sisipkan, Pembaruan, atau Hapus ke tabel atau tampilan (pemicu DML) Buat [atau alter] Pemicu [Schema_Name. ] Trigger_name pada (tabel | Lihat) [DENGAN. [, ... n]] (Untuk | sesudah | bukan) ([masukkan] [,] [perbarui] [,] [hapus]) [dengan menambahkan] [bukan untuk replikasi] sebagai (sql_statement [, ... n] | nama eksternal | } :: \u003d [Enkripsi] [Jalankan sebagai klausa] :: \u003d assembly_name.class_name.method_name.

Syntax SQL Server - Memicu pada Pernyataan Sisipkan, Pembaruan, atau Hapus ke tabel (tabel DML) Buat [atau alter] Pemicu [Schema_Name. ] Trigger_name pada (tabel) [dengan [, ... n]] (untuk | setelah) ([masukkan] [,] [perbarui] [,] [hapus]) sebagai (sql_statement [;] [, ... n]) :: \u003d [Native_Compilation] [Schemabinding] [Jalankan sebagai klausa]

Pemicu pada Buat, Alter, Drop, Grant, DENY, REVOKE atau Pernyataan Pembaruan (DDL Trigger) Buat [atau ubah] Pemicu Trigger_Name pada (semua server | basis data) [dengan [, ... n]] (untuk | setelah) (event_type | event_group) [, ... n] as (sql_statement [;] [, ... n] | nama eksternal< method specifier > [ ; ] }

Pemicu Acara Logon (Pemicu Logon) Buat [atau ubah] Pemicu Trigger_Name di semua server [dengan [, ... n]] (untuk | setelah) masuk sebagai (sql_statement [;] [, ... n] | nama eksternal< method specifier > [ ; ] } :: \u003d [Enkripsi] [Jalankan sebagai klausa]

Windows Azure SQL Database Sintaks - Memicu pada Pernyataan Sisipkan, Pembaruan, atau Penghapusan ke tabel atau tampilan (pemicu DML) Buat [atau ubah] Pemicu [Schema_Name. ] Trigger_name pada (tabel | Lihat) [dengan [, ... n]] (untuk | setelah | bukannya) ([masukkan] [,] [perbarui] [,] [hapus]) sebagai (sql_statement [;] [, ... n] [;] [, ... ) :: \u003d [Jalankan sebagai klausa]

Windows Azure SQL Database Sintaks - Pemicu pada Buat, Alter, Drop, Grant, DENY, PEMBACAAN, atau Pernyataan Statistik Pembaruan (Pemicu DDL) Buat [atau Alter] Pemicu Trigger_Name pada (basis data) [dengan [, ... n]] (untuk | setelah) (event_type | event_group) [, ... n] as (sql_statement [;] [, ... n] [;] [;] [;] [;]) :: \u003d [Jalankan sebagai klausa]

Condifly mengubah pemicu hanya jika sudah ada.

schema_name.
Nama diagram milik pemicu DML. Tindakan pemicu DML terbatas pada area tabel tabel atau representasi yang mereka buat. schema_name. Tidak dapat ditentukan untuk pemicu atau input DDL.

name_trigger.
Nama pemicunya. Sebuah Objek name_trigger. harus mematuhi aturan untuk, kecuali itu name_trigger. Tidak dapat memulai dengan karakter # atau ##.

meja | mELIHAT.
Tabel atau representasi di mana pemicu DML dilakukan, kadang-kadang diindikasikan sebagai tabel pemicu atau representasi pemicu. Perhatikan nama atau pengajuan tabel yang ditentukan tidak wajib. Hanya alih-alih triger yang merujuk pada presentasi. Pemicu DML tidak dapat dijelaskan dalam tabel sementara lokal atau global.

Database.
Menerapkan ruang pemicu DDL ke basis data saat ini. Jika ditentukan, pemicu berfungsi kapan saja event_type. atau event_group. terjadi pada basis data saat ini.

Menerapkan ruang lingkup pemicu DDL atau pemicu entri ke server saat ini. Jika ditentukan, pemicu berfungsi kapan saja event_type. atau event_group. Ada tempat di server saat ini di mana saja.

Menggelapkan teks dari instruksi pemicu yang dibuat. Menggunakan parameter enkripsi tidak memungkinkan Anda untuk mempublikasikan pemicu sebagai bagian dari replikasi SQL Server. Parameter enkripsi tidak dapat ditentukan untuk pemicu CLR.

Jalankan sebagai.
Menentukan konteks keamanan di mana pemicunya dilakukan. Memungkinkan Anda mengelola akun pengguna yang digunakan oleh instance SQL Server untuk memverifikasi izin ke objek basis data apa pun yang merujuk pada pemicu.

Untuk informasi lebih lanjut, lihat bagian.

Native_Compilation.
Menunjukkan bahwa pemicunya dikompilasi dalam kode sendiri.

Parameter ini wajib untuk pemicu dalam tabel yang dioptimalkan untuk memori.

Schembinding.
Ini memastikan bahwa tabel yang dirujuk oleh pemicu tidak dapat dihapus atau diubah.

Parameter ini wajib untuk pemicu dalam tabel yang dioptimalkan untuk memori dan tidak didukung untuk pemicu dalam tabel konvensional.

Untuk | Setelah
Jenis setelah menunjukkan bahwa pemicu DML dipicu hanya setelah berhasil melaksanakan semua operasi dalam instruksi SQL, diluncurkan oleh pemicu. Semua tindakan kaskade dan pemeriksaan untuk keterbatasan di mana ada tautan harus berhasil diselesaikan sebelum pemicu akan berfungsi.

Jika satu-satunya kata kunci yang ditentukan adalah untuk, argumen palu digunakan secara default.

Setelah pemicu tidak dapat didefinisikan pada ide.

Dari pada.
Menunjukkan bahwa pemicu DML dilakukan sebagai gantinya Oleh karena itu, menjalankan pernyataan SQL, dengan mengesampingkan tindakan instruksi awal. Alih-alih argumen tidak dapat ditentukan untuk pemicu DDL atau pemicu entri.

Untuk setiap sisipan, perbarui, atau hapus instruksi di tabel atau lihat, tidak lebih dari satu pemicu, bukannya dapat ditentukan. Namun, dimungkinkan untuk menentukan pandangan tentang pandangan di mana setiap tampilan memiliki triger sendiri, bukan.

Menggunakan alih-alih pemicu tidak diperbolehkan dalam mendukung pengiriman yang menggunakan parameter opsi periksa. SQL Server menyebabkan kesalahan jika alih-alih pemicu ditambahkan ke dukungan dukungan dengan parameter opsi periksa. Pengguna harus menghapus parameter ini menggunakan instruksi view alter sebelum menentukan astead trigegeg.

([Hapus] [,] [INSERT] [,] [Perbarui])
Menentukan instruksi perubahan data di mana pemicu DML dipicu jika diterapkan pada tabel atau representasi. Anda harus menentukan setidaknya satu instruksi. Dalam definisi pemicu, kombinasi mereka dalam urutan apa pun diizinkan.

Untuk alih-alih alih-alih parameter hapus tidak diperbolehkan dalam tabel memiliki koneksi referensi dengan tindakan cascading pada delete. Demikian pula, parameter pembaruan tidak diperbolehkan dalam tabel yang memiliki koneksi referensi dengan tindakan kaskade pada pembaruan.

Menunjukkan bahwa pemicu tipe yang ada diperlukan. Dengan argumen tambahan tidak dapat digunakan untuk alih-alih pemicu atau dengan secara eksplisit menentukan pemicu semangka. Dengan argumen tambahan hanya dapat digunakan saat menentukan parameter tanpa alih-alih atau setelah alasan dukungan kompatibilitas mundur. Dengan argumen tambahan tidak dapat ditentukan jika parameter nama eksternal ditentukan (dalam kasus pemicu CLR).

event_type.
Nama Acara Bahasa Transact-SQL, yang setelah eksekusi menyebabkan pemicu pemicu DDL. Acara yang valid untuk pemicu DDL tercantum dalam.

event_group.
Nama grup Acara Bahasa Transact-SQL standar. Pemicu DDL dipicu setelah melakukan peristiwa transaksi-SQL yang dimiliki event_group.. Daftar grup acara untuk pemicu DDL tercantum dalam.

Setelah menyelesaikan pekerjaan, instruksi pemicu buat event_group. Juga berfungsi sebagai makro, menambahkan peristiwa dari jenis yang sesuai dengan tampilan direktori sys.trigger_events.

Bukan untuk replikasi

Menunjukkan bahwa pemicunya tidak dapat dieksekusi jika agen replikasi mengubah tabel yang digunakan oleh pemicu.

sql_statement.
Kondisi dan tindakan pemicu. Kondisi pemicu menunjukkan kriteria tambahan yang menentukan peristiwa mana - DML, DDL, atau acara input - menyebabkan pemicu pemicu.

Tindakan pemicu yang ditentukan dalam instruksi bahasa transaksi-SQL mulai berlaku setelah mencoba menggunakan operasi.

Pemicu mungkin berisi sejumlah bahasa transaksi-SQL dari jenis apa pun, untuk beberapa pengecualian. Untuk informasi lebih lanjut, lihat ayat "Catatan". Pemicu dirancang untuk mengontrol atau mengubah data berdasarkan modifikasi atau instruksi definisi data; Mereka tidak mengembalikan data apa pun kepada pengguna. Transact-SQL sering berisi instruksi dalam pemicu bahasa Kontrol Aliran..

Pemicu DML menggunakan tabel logis (konseptual) yang dihapus dan dipasangkan. Dengan strukturnya, mereka mirip dengan tabel di mana pemicu didefinisikan, yaitu, tabel yang digunakan tindakan pengguna. Tabel yang dihapus dan dipasangkan mengandung nilai baris lama atau baru yang dapat diubah oleh tindakan pengguna. Misalnya, Anda dapat menggunakan instruksi untuk meminta semua nilai dari tabel yang dihapus:

Pilih * dari dihapus;

Untuk informasi lebih lanjut, lihat bagian.

DDL memicu dan koleksi logon informasi tentang acara yang berjalan menggunakan fungsi. Untuk informasi lebih lanjut, lihat bagian.

SQL Serverells memperbarui teks, ntext., atau gambar Kolom memicu dengan bantuan alih-alih untuk tabel atau representasi.

Untuk pemicu dalam tabel dioptimalkan untuk yang unik sql_statement. Diizinkan di tingkat atas unit atom. Ini diperbolehkan di dalam blok T-SQL atom, terbatas pada dalam prosedur T-SQL sendiri.

< method_specifier >

Menunjukkan metode perakitan untuk mengikat ke pemicu CLR. Metode ini tidak boleh menerima argumen dan mengembalikan nilai batal. nama kelas. Harus menjadi pengidentifikasi server SQL yang valid dan ada sebagai kelas dalam perakitan perakitan. Jika kelas memiliki nama yang berisi poin (.) Untuk memisahkan bagian namespace, nama kelas harus ditutup dalam tanda kurung persegi () atau kutipan ganda (""). Kelas tidak bisa disematkan.

Pemicu DML sering digunakan untuk menerapkan aturan bisnis dan integritas data. Pembatasan integritas referensi Referensi SQL Server disediakan oleh tabel alter dan membuat instruksi tabel. Namun, keterbatasan deklaratif integritas referensi tidak memberikan integritas referensi antara database. Membatasi integritas referensi menyiratkan pelaksanaan aturan komunikasi antara kunci primer dan eksternal dari tabel. Untuk mengaktifkan Referensi Integrity Restrictions, gunakan kunci utama dan kunci FORGN di tabel alter dan buat tabel tabel. Jika batasan berlaku untuk tabel pemicu, mereka diperiksa setelah Astead of TriGer dipicu dan sebelum mengeksekusi pemicu pengagaian. Dalam hal pelanggaran pembatasan, tindakan pemicu alih-alih, dan setelah pemicu tidak berfungsi.

Yang pertama dan terakhir setelah pemicu, yang akan dilakukan dalam tabel, dapat didefinisikan dengan menggunakan prosedur SP_SETTRIGGEROTER. Untuk sebuah tabel, Anda dapat menentukan hanya satu pemicu pertama dan satu terakhir untuk masing-masing operasi Sisipkan, Perbarui dan Hapus. Jika ada yang lain setelah pemicu di tabel, mereka akan dilakukan secara acak.

Jika alter memicu manual mengubah pemicu pertama atau terakhir, set atribut pertama atau terakhir dari pemicu yang dimodifikasi dihapus, dan urutan penyortiran harus diatur ke prosedur SP_SetTriggerderder.

Pemicu setelah dilakukan hanya setelah pemicu memanggil instruksi SQL telah berhasil diselesaikan. Implementasi yang berhasil juga menyiratkan penyelesaian semua tindakan cascade referensi dan verifikasi pembatasan yang terkait dengan objek yang dimodifikasi atau jarak jauh. Pemicu setelah pemicu pemicu conkursi bukan di tabel yang sama.

Jika alih-alih alih-alih didefinisikan untuk tabel berkinerja sehubungan dengan tabel instruksi apa pun yang menyebabkan respons pemicu bukannya, pemicu tidak disebut secara rekursif. Sebaliknya, instruksi diproses seolah-olah tabel tidak memiliki konfigurasi sebagai gantinya, dan urutan pembatasan dimulai dan melaksanakan pemicu pengagaian. Misalnya, jika pemicu didefinisikan sebagai alih-alih memasukkan pemicu untuk tabel dan mengeksekusi instruksi insert untuk tabel yang sama, instruksi insert tidak menyebabkan operasi pemicu baru. Perintah Sisipkan yang dilakukan oleh pemicu memulai proses penerapan batasan dan platform semua setelah pemicu insert didefinisikan untuk tabel ini.

Jika alih-alih bukannya didefinisikan untuk presentasi berkinerja sehubungan dengan tampilan instruksi apa pun yang bukannya pemicu respons lagi, pemicunya disebut secara rekursif. Sebaliknya, instruksi membuat perubahan pada tabel dasar di mana tampilan didasarkan. Dalam hal ini, definisi harus memenuhi semua batasan yang ditetapkan untuk representasi yang diperbarui. Definisi tampilan yang diperbarui, lihat bagian.

Misalnya, jika pemicunya didefinisikan sebagai alih-alih pembaruan untuk mewakili dan mengeksekusi instruksi pembaruan untuk tampilan yang sama, instruksi pembaruan yang dijalankan oleh pemicu tidak menyebabkan operasi pemicu baru. Instruksi pembaruan dilakukan pada pemicu memproses gagasan seolah-olah presentasi tidak memiliki pemicu. Kolom, dimodifikasi menggunakan instruksi pembaruan, harus menjadi milik satu tabel dasar. Setiap modifikasi dari tabel dasar menyebabkan penggunaan urutan pembatasan dan peleton respons setelah didefinisikan untuk tabel ini.

Periksa tindakan pembaruan atau masukkan instruksi pada kolom yang ditentukan

Transact-SQL Trigger dapat dibangun untuk melakukan tindakan spesifik berdasarkan pada perubahan kolom tertentu menggunakan pembaruan atau menyisipkan instruksi. Gunakan atau dalam tubuh pemicu untuk tujuan ini. Desain pembaruan () memeriksa pembaruan atau masukkan instruksi pada satu kolom. Menggunakan desain koloms_updated, instruksi pembaruan atau menyisipkan, dilakukan pada beberapa kolom, diperiksa, dan template bit dikembalikan, menunjukkan kolom mana yang dimasukkan atau diperbarui.

Pemicu pembatasan.

Instruksi penciptaan memicu harus menjadi instruksi pertama dalam paket dan hanya dapat diterapkan ke satu tabel.

Pemicunya hanya dibuat dalam database saat ini, tetapi mungkin, bagaimanapun, berisi referensi ke objek di luar basis data saat ini.

Jika nama diagram ditentukan untuk menyempurnakan pemicu, nama tabel harus diklarifikasi dengan cara yang sama.

Tindakan pemicu yang sama dapat didefinisikan oleh lebih dari satu tindakan pengguna (misalnya, menyisipkan dan memperbarui) dalam membuat instruksi pemicu yang sama.

Alih-alih memicu / pembaruan pemicu tidak dapat didefinisikan untuk tabel yang memiliki kunci eksternal yang didefinisikan untuk eksekusi cascading dari operasi penghapusan / pembaruan.

Di dalam pelatuk, instruksi set dapat digunakan. Parameter set yang dipilih tetap berlaku selama pelaksanaan pemicu, setelah itu pengaturan dikembalikan ke keadaan sebelumnya.

Selama pemicu pemicu, hasil dikembalikan oleh aplikasi panggilan serta dalam kasus prosedur tersimpan. Untuk mencegah pemicu pemicu yang dihasilkan, hasil pengembalian kembali tidak boleh menyertakan instruksi pemilihan yang mengembalikan hasil, atau instruksi yang dilakukan dalam penugasan pemicu variabel. Pemicu berisi petunjuk pilih yang mengembalikan hasil ke pengguna atau instruksi yang menetapkan variabel memerlukan sirkulasi khusus; Hasil yang dikembalikan ini harus ditimpa ke semua aplikasi di mana perubahan tabel pemicu diizinkan. Jika suatu penugasan variabel dalam pelatuk, Anda harus menggunakan pernyataan SET NOCOUT di awal pemicu untuk mencegah hasil hasil.

Meskipun instruksi Tabel Truncate dalam esensinya adalah instruksi hapus, itu tidak mengaktifkan pemicu, karena operasi tidak mencatat penghapusan garis individual. Namun, perlu dikhawatirkan tentang kerusakan acak pemicu hapus dengan cara ini hanya pengguna dengan izin untuk mengeksekusi instruksi tabel terpotong.

Instruksi Writetext (dengan logging dan tanpanya) tidak memulai pemicu.

Instruksi bahasa transaksi-SQL berikut tidak diperbolehkan dalam pemicu DML:

Pemicu DDL, serta pemicu standar, melakukan prosedur tersimpan sebagai respons terhadap peristiwa apa pun. Tidak seperti pemicu standar, mereka tidak dipicu dalam menanggapi pelaksanaan pembaruan, masukkan atau menghapus instruksi relatif terhadap tabel atau representasi. Sebaliknya, pemicu dipicu terlebih dahulu sebagai respons terhadap instruksi bahasa definisi data (DDL). Ini adalah instruksi yang menciptakan, mengubah, menjatuhkan, memberikan, menyangkal, mencabut dan memperbarui statistik. Prosedur tersimpan sistem yang melakukan operasi seperti operasi DDL juga dapat menjalankan pemicu DDL.

Untuk informasi lebih lanjut tentang pemicu DDL, lihat bagian.

Pemicu DDL tidak dipicu sebagai respons terhadap peristiwa yang mempengaruhi tabel sementara lokal atau global dan prosedur tersimpan.

Berbeda dengan pemicu DML, pemicu DDL tidak terbatas pada area skema. Oleh karena itu, untuk meminta metadata tentang pemicu DDL, Anda tidak dapat menggunakan fungsi seperti Object_ID, Object_Name, ObjectProperty dan ObjectPropertyex. Gunakan presentasi direktori sebagai gantinya. Untuk informasi lebih lanjut, lihat bagian.

Pemicu input melakukan prosedur tersimpan sebagai respons terhadap acara masuk. Acara ini disebut saat memasang sesi khusus dengan instance SQL Server. Pemicu input dipicu setelah penyelesaian fase otentikasi saat masuk, tetapi sebelum sesi pengguna sebenarnya ditetapkan. Akibatnya, semua pesan yang terjadi dalam pemicu biasanya mencapai pengguna, seperti pesan kesalahan dan pesan dari instruksi cetak, dialihkan ke log kesalahan SQL Server. Untuk informasi lebih lanjut, lihat bagian.

Jika otentikasi gagal, pemicu input tidak dipicu.

Pemicu input tidak didukung transaksi terdistribusi. Jika pemicu entri dipicu, berisi transaksi terdistribusi, kesalahan 3969 dikembalikan.

Mematikan pemicu masuk

Pemicu input dapat secara efektif menonaktifkan koneksi ke komponen mesin basis data untuk semua pengguna, termasuk anggota peran server yang telah ditentukan. sysadmin. . Jika pemicu input melarang koneksi, anggota peran server yang telah ditentukan sebelumnya sysadmin. Dapat dihubungkan menggunakan koneksi administratif yang dipilih atau dengan memanggil komponen mesin basis data dalam mode konfigurasi minimum (-f). Untuk informasi lebih lanjut, lihat bagian.

Hasil pengembalian

Kemampuan untuk mengembalikan hasil dari pemicu akan dikecualikan dari versi SQL Server berikut. Pemicu yang mengembalikan set hasil dapat menyebabkan perilaku aplikasi yang tidak terduga yang tidak dimaksudkan untuk bekerja dengannya. Jangan gunakan pemicu dalam aplikasi yang dikembangkan yang mengembalikan hasil set dan menjadwalkan perubahan aplikasi yang menggunakannya saat ini. Untuk pemicu untuk mengembalikan set yang dihasilkan, atur nilai 1.

Pemicu input selalu melarang pengembalian dana dari set yang dihasilkan, dan perilaku ini tidak dapat dikonfigurasi. Jika pemicu input menghasilkan set yang dihasilkan, maka pemicunya tidak dilakukan dan upaya masuk yang disebabkan oleh pemicu dilarang.

Beberapa pemicu

SQL Server memungkinkan Anda membuat beberapa pemicu untuk setiap Acara DML, DDL dan Logon. Misalnya, jika membuat pemicu manual pembaruan dilakukan dalam tabel yang sudah memiliki pemicu pembaruan, pemicu pembaruan juga dibuat. Di versi SQL Server sebelumnya, hanya satu pemicu yang diizinkan di setiap tabel untuk setiap data Ubah Peristiwa, perbarui atau hapus.

Pemicu rekursif

SQL Server memungkinkan panggilan pemicu rekursif, jika menggunakan instruksi database ALTER, pengaturan rekursif_triggers diaktifkan.

Jenis rekursi berikut dapat terjadi pada pemicu rekursif:

    Rekursi tidak langsung

    Dengan rekursi tidak langsung, aplikasi memperbarui tabel T1. Acara ini menyebabkan Trigger Triger Tr.1 yang memperbarui tabel T2. Ini menyebabkan memicu pemicu T2 dan memperbarui tabel T1.

    Rekursi langsung

    Dengan rekursi langsung, aplikasi memperbarui tabel T1. Acara ini menyebabkan respons Tri1 memicu yang memperbarui tabel T1. Karena tabel T1 sudah diperbarui, Trig Trigger memicu lagi dan seterusnya.

Contoh berikut menggunakan kedua jenis rekursi: lurus dan tidak langsung. Misalkan tabel T1 mendefinisikan dua pemicu: TR1 dan TR2. TR1 memicu secara rekursif memperbarui tabel T1. Instruksi pembaruan melakukan masing-masing pemicu TR1 dan TR2 sekali. Selain itu, pemicu pemicu Tri1 memicu pemicu pemicu (secara rekursif) dan TR2. Tabel pemicu yang dimasukkan dan dihapus mengandung garis-garis yang hanya berlaku untuk instruksi pembaruan yang menyebabkan pemicu pemicu.

Nonaktifkan pengaturan rekursif_triggers mencegah rekursi langsung. Untuk menonaktifkan rekursi tidak langsung, menggunakan prosedur SP_Configure yang disimpan, tetapkan server pemicu bersarang menjadi 0.

Jika salah satu pemicu melakukan instruksi transaksi rollback, tidak ada pemicu lain, terlepas dari tingkat bersarang, tidak dipicu.

Disepuh pemicu

Pemicu bersarang dapat mencapai level 32 maksimum. Jika pemicu mengubah tabel yang dipicu lain didefinisikan, maka pemicu kedua diluncurkan, yang menyebabkan pemicu yang ketiga, dll. Jika salah satu pemicu dalam rantai mematikan siklus tak terbatas, level bersarang melebihi batas yang diizinkan, dan respons pemicu dibatalkan. Jika Transact-SQL Trigger melakukan kode yang dikendalikan menggunakan referensi ke metode, ketik atau fungsi statistik dari lingkungan CLR, tautan ini dianggap sebagai salah satu dari 32 level bersarang yang diizinkan. Metode yang disebabkan oleh kode yang dikelola tidak dikenakan pembatasan ini.

Untuk membatalkan pemicu bersarang, atur nilai 0 Parameter SP_Configure Parameter bersarang. Dalam konfigurasi default, pemicu bersarang diizinkan. Jika pemicu yang terlampir dinonaktifkan, pemicu rekursif juga akan dinonaktifkan, terlepas dari pengaturan rekursif_triggers yang diinstal menggunakan instruksi database ALTER.

Yang pertama setelah pemicu yang tertanam di alih-alih, pemicu dipicu, bahkan jika disepuh pemicu Parameter konfigurasi server diatur ke 0. Namun, dengan nilai parameter ini, pemicu selanjutnya tidak dipicu. Disarankan untuk memeriksa aplikasi untuk pemicu bersarang untuk menentukan apakah aplikasi memenuhi aturan bisnis perilaku ini disepuh pemicu Parameter konfigurasi server adalah 0 dan membuat perubahan yang sesuai.

Penelusuran interpretasi nama

SQL Server menyajikan prosedur tersimpan, pemicu dan paket dalam bahasa Transact-SQL, yang berisi referensi ke tabel yang tidak ada pada saat kompilasi. Peluang seperti itu disebut interpretasi nama ditangguhkan.

Untuk membuat pemicu DML membutuhkan izin ubah ke tabel atau representasi di mana pemicu dibuat.

Untuk membuat pemicu DDL dengan area tindakan di dalam server (di semua server) atau pemicu login memerlukan izin server kontrol ke server. Untuk membuat pemicu DDL dengan area visibilitas dalam database (pada basis data), Alter setiap basis data, izin pemicu DDL diperlukan untuk basis data saat ini.

A. Menggunakan pemicu DML dengan pesan peringatan

Pemicu DML berikut mengirimkan pesan kepada klien ketika seseorang mencoba menambah atau mengubah data di tabel pelanggan di database AdventureWorks2012.

Buat pemicu reminder1 pada penjualan. Pelanggan setelah memasukkan, memperbarui sebagai RaisError ("Beri tahu Hubungan Pelanggan", 16, 10); Pergilah.

B. Menggunakan pemicu DML dengan pesan peringatan yang dikirim melalui email

Dalam contoh berikut, pengguna yang ditentukan (MaryM) E-mail pesan dikirim ketika tabel pelanggan berubah.

Buat pemicu reminder2 pada penjualan. Pelanggan setelah memasukkan, perbarui, hapus sebagai execs msdb.dbo.sp_send_dbmail @profile_name \u003d "Administrator AdventureWorks2012", @Recipiens \u003d " [Dilindungi Email]", @body \u003d "Jangan lupa untuk mencetak laporan untuk tenaga penjualan.", @subject \u003d "Reminder"; Pergilah.

B. Menggunakan DML setelah pemicu untuk aturan bisnis aplikasi paksa antara pembelianOrdeader dan tabel vendor

Karena pembatasan periksa mungkin berisi referensi hanya ke kolom di mana keterbatasan pada tingkat kolom atau tabel didefinisikan, intersabilitas (dalam hal ini, aturan bisnis) harus ditentukan dalam bentuk pemicu.

Contoh berikut membuat pemicu DML di database Adventureworks. Pemicu ini melakukan verifikasi kelayakan kredit pemasok baik (bukan 5) ketika mencoba memasukkan pesanan pembelian baru di tabel PurcherostHeader. Untuk informasi tentang kelayakan kredit pemasok, tautan ke tabel vendor diperlukan. Dalam kasus kelayakan kredit yang terlalu rendah, pesan yang sesuai ditampilkan dan sisipan tidak dilakukan.

Pemicu ini mencegah baris dimasukkan dalam Tabel Pembelian.PurchaseOrderHeader - Ketika peringkat kredit vendor yang ditentukan diatur ke 5 (di bawah rata-rata). Buat pemicu pembelian.lowcredit pada pembelian.purchaseOrdeader Setelah memasukkan seolah-olah ada (pilih * dari pembelian.purchaseOrdeader sebagai p v.creditrating \u003d 5) Mulai RaisError ( Peringkat kredit "vendor" juga rendah untuk menerima pesanan pembelian baru. ", 16 , 1 ); Transaksi rollback; Kembali. Akhir; Pergilah. - Pernyataan ini berupaya memasukkan baris ke dalam tabel Purcherosteader - Untuk vendor yang memiliki peringkat kredit di bawah rata-rata. - Pemicu setelah masukkan dipecat dan transaksi insert digulung kembali. Masukkan ke dalam pembelian.purchaseOrdeader (revisionnumber, status, usaha, vendorid, shipmethodid, planddate, shipdate, subtotal, pajak, pengiriman) (2, 3, 261, 1652, 44594.55, GetDate (), 44594.55, 3567.564, 1114.8638); Pergilah.

Menggunakan pemicu DDL DDL

Dalam contoh berikut, pemicu DDL digunakan untuk mencegah sinonim untuk basis data.

Buat keselamatan pemicu pada basis data untuk drop_synonim sebagai RaisError ( "Kamu harus menonaktifkan pemicu" keselamatan "untuk menjatuhkan sinonim!", 10, 1) Rollback Go Drop Trigger Safety pada basis data; Pergilah.

D. Menggunakan Pemicu DDL Server

Dalam contoh berikut, pemicu DDL digunakan untuk menampilkan pesan ketika Anda terjadi pada instance server dari Acara Buat Database, dan fungsi EventData digunakan untuk mendapatkan teks dari instruksi yang sesuai dalam transaksi-SQL. Contoh tambahan menggunakan fungsi EventData dalam pemicu DDL lihat.

Buat pemicu ddl_trig_database pada semua server untuk create_database sebagai cetak "basis data dibuat." Pilih EventData () Nilai ( "(/ Event_instance / tsqlcommand / commandtext)", "Nvarchar (maks)") pergi drop trigger ddl_trig_database pada semua server; Pergilah.

E. Menggunakan pemicu masuk

Dalam contoh berikut, pemicu entri melarang upaya untuk memasuki anggota SQL Server login_test. Masukan jika sudah ada tiga sesi pengguna di bawah akun ini.

Gunakan master; Pergilah. Buat login login_test dengan kata sandi \u003d "3KHJ6DHX (0xVYSDF" must_change, check_expiration \u003d on; Pergilah. Grant View Server State ke login_test; Pergilah. Buat pemicu connection_limit_trigger pada semua server dengan execute sebagai "login_test" untuk logon sebagai mulai jika original_login () \u003d "login_test" dan (pilih jumlah (*) dari sys .dm_exec_sessions \u003d 1 dan original_login_name \u003d "Login_Test")\u003e