Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Firebird Π Π£ΠšΠžΠ’ΠžΠ”Π‘Π’Π’Πž Π ΠΠ—Π ΠΠ‘ΠžΠ’Π§Π˜ΠšΠ БАЗ ДАННЫΠ₯Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 146

Автор Π₯Π΅Π»Π΅Π½ Π‘ΠΎΡ€Ρ€ΠΈ

IF (NEED_CHECK = 1) THEN

BEGIN

SELECT L1.UQ_ID FROM LOOKUP L1

WHERE L1.START_DATE <= CAST(NEW.TRANSAC_DATE AS DATE)

AND L1.END_DATE >= CAST(NEW.TRANSAC_DATE AS DATE)

AND L1.VALUE2 = (SELECT L2.VALUE2 FROM LOOKUP L2

WHERE L2.UQ_ID = NEW.LOOKUP_ID)

INTO :LOOKUP_NUM;

NEW.LOOKUP_ID = LOOKUP_NUM;

END

END ^

COMMIT ^

SET TERM ;^


ИзмСнСниС строк Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ вопрос ΠΎΠ± использовании Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° для измСнСния строк Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π° Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ выполняСт дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ этого ΠΆΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°, ΠΈΠ»ΠΈ это дСйствиС Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт дСйствиС, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΆΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ бСсконСчный Ρ†ΠΈΠΊΠ». По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ дСйствия Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ самого сСбя, Π΄Π°ΠΆΠ΅ опосрСдованно.

Если ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ подошли ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ зависимости Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ строками ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‚ΠΎ, скорСС всСго, это сигнал ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эта Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π΅ относится ΠΊ иСрархичСской структурС. Если Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ структуры строки влияСт Π½Π° (ΠΈΠ»ΠΈ Π½Π° Π½Π΅Π³ΠΎ влияСт) ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния Π΄Ρ€ΡƒΠ³ΠΎΠΉ строки, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ сСгмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ пСрСнСсСн Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с внСшним ΠΊΠ»ΡŽΡ‡ΠΎΠΌ для поддСрТания ΠΏΡ€Π°Π²ΠΈΠ»Π° зависимости.


Π‘ΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° сСбя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΡ

Π‘ΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° сСбя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½Ρ‹Π΅ структуры[125], ΡΠ²Π»ΡΡŽΡ‚ΡΡ особым случаСм[126]. КаТдая строка Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ являСтся ΡƒΠ·Π»ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ зависимыС строки. Π›ΡŽΠ±ΠΎΠΉ ΡƒΠ·Π΅Π» ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π΅ Ρ€ΠΎΠ»ΠΈ: ΠΎΠ΄Π½Π°- Ρ€ΠΎΠ»ΡŒ родитСля для ΡƒΠ·Π»ΠΎΠ² Π½ΠΈΠΆΠ΅ Π½Π΅Π³ΠΎ, Π° другая - Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΡƒΠ·Π»Π° Π±ΠΎΠ»Π΅Π΅ высокого уровня. Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹, скорСС всСго, Π±ΡƒΠ΄ΡƒΡ‚ Π½ΡƒΠΆΠ½Ρ‹ для всСх событий DML: для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ повСдСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ссылочной цСлостности ΠΈ для поддСрТания ΠΌΠ΅Ρ‚Π°- Ρ‚Π°Π±Π»ΠΈΡ† (Π³Ρ€Π°Ρ„ΠΎΠ²), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… иСрархичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ…, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΡ… доступной запросам Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΡŽ Π΄Π΅Ρ€Π΅Π²Π°. Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ для Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ спроСктированы с условиями ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ структуру ΠΎΡ‚ бСсконСчных Ρ†ΠΈΠΊΠ»ΠΎΠ².


ИзмСнСниС Ρ‚ΠΎΠΉ ΠΆΠ΅ строки

Никогда Π½Π΅ ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ SQL для измСнСния ΠΈΠ»ΠΈ удалСния Ρ‚ΠΎΠΉ ΠΆΠ΅ самой строки, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€. НапримСр, Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚:


CREATE TRIGGER 0_30_SILLY FOR ATABLE

BEFORE UPDATE

AS

BEGIN

UPDATE ATABLE SET ACOLUMN - NEW.ACOLUMN

WHERE ID = NEW.ID;

END ^


ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ NEW для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ строку Π² Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π΅.

ИзмСнСниС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²

Firebird 1.0.x прСдоставляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ измСнСния Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ² ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² DDL, a Firebird 1.5 добавляСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½.

* ALTER TRIGGER измСняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ модуля Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°, сохраняя Π΅Π³ΠΎ зависимости ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ бСспокойством ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°.

* CREATE OR ALTER TRIGGER (вСрсия 1.5 ΠΈ Π²Ρ‹ΡˆΠ΅) создаСт ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°, Ссли ΠΎΠ½ Π½Π΅ сущСствуСт, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ CREATE TRIGGER. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° ALTER, ΠΈ зависимости ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ.

Π›ΡŽΠ±Π°Ρ опСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ любой ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, которая отмСняСт зависимости.

Бинтаксис для измСнСния Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²

Бинтаксис:


{ALTER TRIGGER ИМЯ} |

{CREATE OR ALTER TRIGGER имя FOR {Ρ‚Π°Π±Π»ΠΈΡ†Π° | просмотр}

[ACTIVE | INACTIVE]

[{BEFORE | AFTER} {DELETE | INSERT | UPDATE}]

[POSITION число]

AS <Ρ‚Π΅Π»ΠΎ-Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°>;


ALTER TRIGGER

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FOR ИМЯ, примСняСмоС Π² CREATE TRIGGER, опускаСтся, ALTER TRIGGER Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ассоциирован Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€.


ИзмСнСниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ALTER TRIGGER для измСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ измСняСмого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° послС ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°. Π›ΡŽΠ±ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π² этом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅, остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ SAVE_SALARY_CHANGE:

ALTER TRIGGER SAVE SALARY CHANGE INACTIVE;

Если измСняСтся ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„Π°Π·Ρ‹ (BEFORE ΠΈΠ»ΠΈ AFTER), ВО событиС (UPDATE, INSERT ΠΈΠ»ΠΈ DELETE) Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ΠΎ. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π·Π°Π½ΠΎΠ²ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ SAVE_SALARY_CHANGE ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ измСнСния, Π° Π½Π΅ послС:

ALTER TRIGGER SAVE_SALARY_CHANGE

ACTIVE BEFORE UPDATE;


ИзмСнСниС Ρ‚Π΅Π»Π°

Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° замСняСт староС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ALTER TRIGGER Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°.

НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ измСняСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ SET CUST NO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» создан с Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ:


CREATE TRIGGER SET_CUST_NO FOR CUSTOMER

BEFORE INSERT

AS

BEGIN

IF (NEW.CUST_NO IS NULL) THEN

NEW.CUST_NO = GEN_ID(CUST_NO_GEN, 1);

END^


ΠœΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ этот Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ добавлял Π½ΠΎΠ²ΡƒΡŽ строку Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ NEW CUSTOMERS ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° новая строка добавляСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ CUSTOMER:


SET TERM ^;

ALTER TRIGGER SET_CUST_NO

BEFORE INSERT AS

BEGIN

IF (NEW.CUST_NO IS NULL) THEN

NEW.CUST_NO = GEN_ID(CUST_NO_GEN, 1);

INSERT INTO NEW_CUSTOMERS(NEW.CUST_NO, CURRENT_DATE) END ^

SET TERM ;^


CREATE OR ALTER TRIGGER

Π’ вСрсии 1.5 этот Π½ΠΎΠ²Ρ‹ΠΉ синтаксис создаСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, Ссли Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΠΈΠ»ΠΈ измСняСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ с этим ΠΈΠΌΠ΅Π½Π΅ΠΌ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ исходный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ CREATE Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова OR ALTER.


Ошибка "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ находится Π² использовании"

Как ΠΈ Π² случаС с Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ, ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ находится Π² использовании" (Object in use), Ссли Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, зависящий ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π’ любом случаС новая вСрсия Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Π½Π΅ станСт Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ доступной Π² БупСрсСрвСрС, Ссли старая вСрсия всС Π΅Ρ‰Π΅ находится Π² кэшС. ВсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ вновь ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡΡ, Ρ‚ΠΎ смогут Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ.

Π’ ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΎΠΌ сСрвСрС новая вСрсия Π±ΡƒΠ΄Π΅Ρ‚ доступна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соСдинится с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….


Inactive/Active

Π’ вСрсии 1.5 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ALTER TRIGGER ... INACTIVE | ACTIVE ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ находится Π² использовании", Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ транзакция Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Π’Π°ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ влияСт Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, которая Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²

Π’ процСссС проСктирования Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ. Для удалСния Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ΡΡŒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ SYSDBA ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ DROP TRIGGER.

Π•Π³ΠΎ синтаксис:

DROP TRIGGER ИМЯ;

Имя Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ удаляСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ SET_CUST_NO:


DROP TRIGGER SET CUST NO;


! ! !

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ нСдоступным, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ALTER TRIGGER имя INACTIVE.

. ! .


ΠŸΠΎΡ€Π° дальшС

ПослСдняя Π³Π»Π°Π²Π° этой части добавляСт ΡΠ°Ρ…Π°Ρ€Π½ΡƒΡŽ Π³Π»Π°Π·ΡƒΡ€ΡŒ Π² наш Ρ‚ΠΎΡ€Ρ‚ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Firebird ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ особСнности PSQL: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ события. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ вСсьма Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΎΠΌ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сотСн Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условий ошибок ΠΈ мноТСством Π²Π°ΡˆΠΈΡ… собствСнных ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ событий Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прилоТСния ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… измСнСниях, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

ГЛАВА 32. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ события.

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ PSQL - Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ - ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки Π² выполняСмом ΠΊΠΎΠ΄Π΅.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ PSQL ΠΏΡ€ΠΈ появлСнии ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ являСтся остановка выполнСния, ΠΎΡ‚ΠΌΠ΅Π½Π° всСй Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ с Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° BEGIN, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ END ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ управлСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ сообщСний ΠΎΠ± ошибкС. Если этим ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ являСтся Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ посылку Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ DML.

Π’ΠΈΠΏΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

* Ошибки SQL - Ρ‚. Π΅. сообщСния SQL, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SQLCODE.

* Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ошибки Firebird, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ, Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ условиям окруТСния. Π£ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ дСвяти- ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ошибки, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с 3355, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ GDSCODE. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΊΠΎΠ΄ΠΎΠ² GDSCODE ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠΎΠ΄ΠΎΠ² SQLCODE, ΠΈ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΈ SQLCODE, ΠΈ GDSCODE.

* ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊ постоянныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ "Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅" Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° опрСдСляСтся спСцифичСскоС условиС.