powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / тригер
8 сообщений из 8, страница 1 из 1
тригер
    #32545460
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно-ли с помощью тригеров изменить данные, которые вставляются в таблицу?
Например,
Код: plaintext
INSERT INTO table1 (field1) VALUES ( 1 )
а в теле тригера для INSERT
Код: plaintext
1.
2.
if field1= 1 
вставляем  2 
endif
...
Рейтинг: 0 / 0
тригер
    #32545538
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет
...
Рейтинг: 0 / 0
тригер
    #32545607
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте для этого хранимые процедуры...
...
Рейтинг: 0 / 0
тригер
    #32545904
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это можно сделать в правилах (RULE), как на поле, так и на всю запись. Особенности работы с правилами можно почитать здесь:

http://www.foxclub.ru/kb/index.php?sid=35321&aktion=artikel&rubrik=004&id=104&lang=ru
...
Рейтинг: 0 / 0
тригер
    #32546583
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел текой пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Триггер INSERT, который будет поддерживать столбцы lvl и hierarchy.


CREATE TRIGGER trg_employees_i_calchierarchy ON Employees FOR INSERT
AS
DECLARE @numrows AS int
SET @numrows = @@rowcount
IF @numrows >  1 
BEGIN
  RAISERROR(`Only single row inserts are supported!`,  16 ,  1 )
  ROLLBACK TRAN
END
ELSE
IF @numrows =  1 
BEGIN
  UPDATE E
  SET lvl =
        CASE
          WHEN E.mgrid IS NULL THEN  0 
          ELSE M.lvl +  1 
        END,
      hierarchy =
        CASE
          WHEN E.mgrid IS NULL THEN `.` 
          ELSE M.hierarchy
        END + CAST(E.empid AS varchar( 10 )) + `.`
  FROM Employees AS E JOIN inserted AS I
    ON I.empid = E.empid
    LEFT OUTER JOIN Employees AS M
    ON E.mgrid = M.empid
END
GO

Получается на фокс перевести єтот код мне не удастся?...
...
Рейтинг: 0 / 0
тригер
    #32546657
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, такое в FoxPro работать не будет, поскольку в нем недопустима рекурсия триггеров.

Однако это можно реализоватье через RULE, поскольку они выполняются ДО триггеров. Т.е. в RULE на уровне таблицы пишешь примерно следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LOCAL lcAlias, lnMgrid 
lcAlias = Alias()
lnMgrid = mgrid 

USE Employees IN  0  AGAIN ALIAS ParentEmpl
select ParentEmpl
LOCATE FOR empid = m.lnMgrid

select (m.lcAlias)
IF IsNull(Employees.mgrid) = .F.
	REPLACE lvl WITH ParentEmpl.lvl +  1 , ;
		hierarchy WITH ParentEmpl.hierarchy + STR(m.empid)
ENDIF

Т.е. произойдет следующее:

При ЛЮБОЙ команде модификации данных в таблице Employees сначала будет выполненно RULE на уровне записи и только потом проверка по триггерам.

В этот кода надо добавить еще проверку на тот факт, что это именно добавление новой записи, а не модификация существующей. Это проще всего реализовать через дополнитеьное поле, которое принимает значения .T. и .F. и заполняется там же (в RULE) в самом конце функции.
...
Рейтинг: 0 / 0
тригер
    #32547367
lnu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но еще несколько попутных вопросов...
Как на счет удаления "ветки"
Запрещен рекурсивный вызов триггера в пределах одной и той же таблицы. Т.е. если сработал, например, триггер на удаление, то Вы никаким способом не сможете внутри триггера на удаление удалить какие-либо еще записи из этой же таблицы (удалить "ветку" в древовидной структуре через триггер не получится). Хотя допустимо удалить записи из другой таблицы.
При удалении записи правила не срабатывают.

вручную из приложения что-ли? Как-то автоматизировать не удасться?

И как физичиски выглядит робота USE db IN 0 AGAIN ALIAS a?
База, скорее всего, будет на другой машине. При выполнении єтой комманды не будут ли копироватся все данные на локальный комп?

Где-то читал, что SELECT-SQL устанавливает только фильтр (если без NOFILTER). Что єто значит? Тоже все данные будут копираватся на локальную машину на которые потом и будет наложен єтот филтр; или только результат запроса (например,одна запись)?
...
Рейтинг: 0 / 0
тригер
    #32547479
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вручную из приложения что-ли? Как-то автоматизировать не удасться?

Да. Только вручную из приложения или отдельными хранимыми процедурками.

И как физичиски выглядит робота USE db IN 0 AGAIN ALIAS a?
База, скорее всего, будет на другой машине. При выполнении єтой комманды не будут ли копироватся все данные на локальный комп?

Команда USE вообще ничего не копирует (точнее копирует только несколько байт заголовка таблицы). Она всего-лишь создает некий "хендл" ("дескриптор", "идентификатор") таблицы.

Где-то читал, что SELECT-SQL устанавливает только фильтр (если без NOFILTER). Что єто значит?

Это значит, что вместо создания временной таблицы, как результата выполнения команды Select-SQL при определенных условиях (очень специфических) будет переоткрыта таблица источник (фактически, выполнено USE ... AGAIN) и на эту "копию" будет наложен фильтр, соответсвтующий условиям запроса в команде Select-SQL

Подробнее здесь

http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru

Тоже все данные будут копираватся на локальную машину на которые потом и будет наложен єтот филтр; или только результат запроса (например,одна запись)?

FoxPro в любом случае оптимизирует информацию, которую он скачивает на клиентскую машину. Что именно он будет скачивать зависит от многих условий. Но в предельном случае "таблица с наложенным фильтром" означет скачивание всей таблицы на клиента.

Кое-что о работе Rushmore-оптимизации можно почитать здесь

http://www.foxclub.ru/kb/index.php?sid=29869&aktion=artikel&rubrik=004&id=57&lang=ru
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / тригер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]