F.41. spi â оÑобенноÑÑи/пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑа пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑа #
- F.41.1. refint â ÑÑнкÑии Ð´Ð»Ñ ÑеализаÑии ÑÑÑлоÑной ÑелоÑÑноÑÑи
- F.41.2. autoinc â ÑÑнкÑии Ð´Ð»Ñ Ð°Ð²ÑоÑвелиÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹
- F.41.3. insert_username â ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, вноÑÑÑего изменениÑ
- F.41.4. moddatetime â ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñемени поÑледнего изменениÑ
- F.41.2. autoinc â ÑÑнкÑии Ð´Ð»Ñ Ð°Ð²ÑоÑвелиÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹
ÐодÑÐ»Ñ spi пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко ÑабоÑÐ¸Ñ Ð¿ÑимеÑов иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐнÑеÑÑейÑа пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑа (Server Programming Interface, SPI) и ÑÑиггеÑов. ХоÑÑ ÑÑи ÑÑнкÑии имеÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ ÑенноÑÑÑ Ñами по Ñебе, они еÑÑ Ð±Ð¾Ð»ÐµÐµ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ ÐºÐ°Ðº загоÑовки, коÑоÑÑе можно пÑиÑпоÑобиÑÑ Ð¿Ð¾Ð´ ÑобÑÑвеннÑе нÑждÑ. ÐÑи ÑÑнкÑии доÑÑаÑоÑно обÑие, ÑÑÐ¾Ð±Ñ ÑабоÑаÑÑ Ñ Ð»Ñбой ÑаблиÑей, но Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно ÑказаÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑаблиÑÑ Ð¸ полей (как опиÑано ниже) пÑи Ñоздании ÑÑиггеÑа.
ÐÐ°Ð¶Ð´Ð°Ñ Ð³ÑÑппа ÑÑнкÑий, опиÑÐ°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ, пÑедÑÑавлена в виде оÑделÑно ÑÑÑанавливаемого ÑаÑÑиÑениÑ.
F.41.1. refint â ÑÑнкÑии Ð´Ð»Ñ ÑеализаÑии ÑÑÑлоÑной ÑелоÑÑноÑÑи #
ФÑнкÑии check_primary_key() и check_foreign_key() пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки огÑаниÑений внеÑниÑ
клÑÑей. (ÐÑа ÑÑнкÑионалÑноÑÑÑ Ñже давно вÑÑеÑнена вÑÑÑоеннÑм меÑ
анизмом внеÑниÑ
клÑÑей, но ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð²ÑÑ ÐµÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в каÑеÑÑве пÑимеÑа.)
ФÑнкÑÐ¸Ñ check_primary_key() пÑовеÑÑÐµÑ ÑÑÑлаÑÑÑÑÑÑ ÑаблиÑÑ. ЧÑÐ¾Ð±Ñ Ð²Ð¾ÑполÑзоваÑÑÑÑ ÐµÐ¹, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ AFTER INSERT OR UPDATE Ñ ÑÑой ÑÑнкÑией Ð´Ð»Ñ ÑаблиÑÑ, ÑÑÑлаÑÑейÑÑ Ð½Ð° дÑÑгÑÑ. УкажиÑе в аÑгÑменÑаÑ
ÑÑиггеÑа: имена ÑÑолбÑов ÑÑÑлаÑÑейÑÑ ÑаблиÑÑ, обÑазÑÑÑиÑ
внеÑний клÑÑ, Ð¸Ð¼Ñ Ñелевой ÑаблиÑÑ Ð¸ имена ÑÑолбÑов в ней, обÑазÑÑÑиÑ
пеÑвиÑнÑй/ÑникалÑнÑй клÑÑ. ЧÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ Ð½ÐµÑколÑко внеÑниÑ
клÑÑей, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñакой ÑÑÑлки.
ФÑнкÑÐ¸Ñ check_foreign_key() пÑовеÑÑÐµÑ ÑелевÑÑ ÑаблиÑÑ. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÑ, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ AFTER DELETE OR UPDATE Ñ ÑÑой ÑÑнкÑией Ð´Ð»Ñ ÑаблиÑÑ, на коÑоÑÑÑ ÑÑÑлаÑÑÑÑ Ð´ÑÑгие. УкажиÑе в аÑгÑменÑаÑ
ÑÑиггеÑа: ÑиÑло ÑÑÑлаÑÑиÑ
ÑÑ ÑаблиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑполниÑÑ Ð¿ÑовеÑки, дейÑÑвие в ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ ÑÑÑлаÑÑегоÑÑ ÐºÐ»ÑÑа (cascade â ÑдалиÑÑ ÑÑÑлаÑÑÑÑÑÑ ÑÑÑокÑ, restrict â пÑеÑваÑÑ ÑÑанзакÑиÑ, setnull â ÑÑÑановиÑÑ Ð² ÑÑÑлаÑÑиÑ
ÑÑ Ð¿Ð¾Ð»ÑÑ
знаÑÐµÐ½Ð¸Ñ NULL), имена ÑÑолбÑов Ñелевой ÑаблиÑÑ, обÑазÑÑÑиÑ
пеÑвиÑнÑй/ÑникалÑнÑй клÑÑ, а заÑем имена ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ ÑÑолбÑов (в колиÑеÑÑве, задаваемом пеÑвÑм аÑгÑменÑом). ÐамеÑÑÑе, ÑÑо Ð¿Ð¾Ð»Ñ Ð¿ÐµÑвиÑнÑÑ
/ÑникалÑнÑÑ
ÑÑолбÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾Ð¼ÐµÑÐºÑ NOT NULL и по ним должен бÑÑÑ Ñоздан ÑникалÑнÑй индекÑ.
ÐбÑаÑиÑе внимание, ÑÑо еÑли ÑÑи ÑÑиггеÑÑ ÑÑабаÑÑваÑÑ Ð¾Ñ Ð´ÑÑгого ÑÑиггеÑа BEFORE, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð½ÐµÐ¿ÑÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾Ñибка. ÐапÑимеÑ, еÑли полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ row1 и заÑем по ÑÑиггеÑÑ BEFORE добавлÑеÑÑÑ row2 и ÑÑабаÑÑÐ²Ð°ÐµÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑÑÐ¸Ð³Ð³ÐµÑ Ñ Ð²Ñзовом ÑÑнкÑии check_foreign_key(), ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ ÑÐ²Ð¸Ð´Ð¸Ñ row1 и пÑоизойдÑÑ Ð¾Ñибка.
ÐÑимеÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² refint.example.
F.41.2. autoinc â ÑÑнкÑии Ð´Ð»Ñ Ð°Ð²ÑоÑвелиÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ #
ФÑнкÑÐ¸Ñ autoinc() ÑеализÑÐµÑ ÐºÐ¾Ð´ ÑÑиггеÑа, ÑоÑ
ÑанÑÑÑего ÑледÑÑÑее знаÑение поÑледоваÑелÑноÑÑи в ÑелоÑиÑленном поле. ÐÑо в некоÑоÑой ÑÑепени пеÑеÑекаеÑÑÑ Ñо вÑÑÑоенной ÑÑнкÑионалÑноÑÑÑÑ ÑÑолбÑа «serial», но еÑÑÑ Ð¸ оÑлиÑиÑ. ТÑÐ¸Ð³Ð³ÐµÑ Ð·Ð°Ð¼ÐµÐ½ÑÐµÑ Ð·Ð½Ð°Ñение полÑ, ÑолÑко еÑли изнаÑалÑно ÑÑо знаÑение â 0 или NULL (поÑле дейÑÑÐ²Ð¸Ñ SQL-опеÑаÑоÑа, добавивÑего или обновивÑего ÑÑÑокÑ). ÐÑоме Ñого, еÑли ÑледÑÑÑее знаÑение поÑледоваÑелÑноÑÑи 0, ÑÑнкÑÐ¸Ñ nextval() вÑзÑваеÑÑÑ Ð²ÑоÑой Ñаз, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½ÐµÐ½Ñлевое знаÑение.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÑ, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE INSERT (или BEFORE INSERT OR UPDATE) Ñ ÑÑой ÑÑнкÑией. ÐеÑедайÑе ÑÑиггеÑÑ Ð´Ð²Ð° аÑгÑменÑа: Ð¸Ð¼Ñ ÑелоÑиÑленного ÑÑолбÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ, и Ð¸Ð¼Ñ Ð¾Ð±ÑекÑа поÑледоваÑелÑноÑÑи, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾ÑÑавлÑÑÑ Ð·Ð½Ð°ÑениÑ. (ÐообÑе Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе задаÑÑ Ð»Ñбое ÑиÑло Ð¿Ð°Ñ ÑакиÑ
имÑн, еÑли Ñ
оÑиÑе поддеÑживаÑÑ Ð½ÐµÑколÑко авÑоÑвелиÑиваÑÑиÑ
ÑÑ ÑÑолбÑов.)
ÐÑÐ¸Ð¼ÐµÑ Ð¿ÑиведÑн в autoinc.example.
F.41.3. insert_username â ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, вноÑÑÑего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ #
ФÑнкÑÐ¸Ñ insert_username() ÑеализÑÐµÑ ÐºÐ¾Ð´ ÑÑиггеÑа, ÑоÑ
ÑанÑÑÑего Ð¸Ð¼Ñ ÑекÑÑего полÑзоваÑÐµÐ»Ñ Ð² ÑекÑÑовом поле. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, изменивÑего конкÑеÑнÑÑ ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ Ð¿Ð¾Ñледним.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÑ, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE INSERT и/или UPDATE Ñ ÑÑой ÑÑнкÑией. ÐеÑедайÑе ÑÑиггеÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑменÑ: Ð¸Ð¼Ñ Ñелевого ÑекÑÑового ÑÑолбÑа.
ÐÑÐ¸Ð¼ÐµÑ Ð¿ÑиведÑн в insert_username.example.
F.41.4. moddatetime â ÑÑнкÑии Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñемени поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ #
ФÑнкÑÐ¸Ñ moddatetime() ÑеализÑÐµÑ ÐºÐ¾Ð´ ÑÑиггеÑа, ÑоÑ
ÑанÑÑÑего ÑекÑÑее вÑÐµÐ¼Ñ Ð² поле Ñипа timestamp. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñемени поÑледней модиÑикаÑии конкÑеÑной ÑÑÑоки ÑаблиÑÑ.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÑ, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE UPDATE Ñ ÑÑой ÑÑнкÑией. ÐеÑедайÑе ÑÑиггеÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑменÑ: Ð¸Ð¼Ñ Ñелевого ÑÑолбÑа. СÑÐ¾Ð»Ð±ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ñип timestamp или timestamp with time zone.
ÐÑÐ¸Ð¼ÐµÑ Ð¿ÑиведÑн в moddatetime.example.