powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Триггер
17 сообщений из 17, страница 1 из 1
Триггер
    #39572294
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста) мне нужно написать триггер который запрещает изменение некоторых значений.
Эти значения я нахожу вот так:
(select fname from Faculty
natural join(
select fid from(
select fid,count(fid) as c from Relationship
group by fid)
where c>0)));

Потом делаю триггер:
CREATE TRIGGER error BEFORE UPDATE OF fname
ON Faculty
BEGIN
SELECT RAISE(FAIL, "Произошла ошибка, на этом факультете учатся студенты") FROM Faculty
WHERE (fname=(select fname from Faculty
natural join(
select fid from(
select fid,count(fid) as c from Relationship
group by fid)
where c>0)));
END;

Но этот триггер ввобще запретил обновлять fname в таблице, а мне нужен запрет только на нужные.
как это сделать? помогите пожалуйста)
...
Рейтинг: 0 / 0
Триггер
    #39572473
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998Помогите пожалуйста) мне нужно написать триггер который запрещает изменение некоторых значений.
Эти значения я нахожу вот так:
(select fname from Faculty
natural join(
select fid from(
select fid,count(fid) as c from Relationship
group by fid)
where c>0)));

Потом делаю триггер:
CREATE TRIGGER error BEFORE UPDATE OF fname
ON Faculty
BEGIN
SELECT RAISE(FAIL, "Произошла ошибка, на этом факультете учатся студенты") FROM Faculty
WHERE (fname=(select fname from Faculty
natural join(
select fid from(
select fid,count(fid) as c from Relationship
group by fid)
where c>0)));
END;

Но этот триггер ввобще запретил обновлять fname в таблице, а мне нужен запрет только на нужные .
как это сделать? помогите пожалуйста)

Триггер прав, ему - 5, вам - 2
...
Рейтинг: 0 / 0
Триггер
    #39572687
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, вы знаете как исправить?
...
Рейтинг: 0 / 0
Триггер
    #39572723
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998Ролг Хупин, вы знаете как исправить?

Зачем так

Код: sql
1.
2.
3.
4.
5.
6.
select fid from
(
  select fid,count(fid) as c from Relationship
  group by fid
)
where c>0



а не так

Код: sql
1.
2.
3.
4.
5.
6.
select fid from
(
  select fid,count(fid) as c from Relationship
  group by fid
  having count(fid)>0
)




и так

Код: sql
1.
2.
3.
4.
5.
6.
select fname from Faculty f inner join
(
  select fid,count(fid) as c from Relationship
  group by fid
  having count(fid)>0
) t on t.fid=f.fid



"Но этот триггер ввобще запретил обновлять fname в таблице, а мне нужен запрет только на нужные.
как это сделать? "


Он запретил обновлять все, которые попадают в вашу выборку.
Что такое "нужные" - знаете только вы.
...
Рейтинг: 0 / 0
Триггер
    #39572917
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, ну проблема же не в этом)
...
Рейтинг: 0 / 0
Триггер
    #39572921
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, у меня есть 5 записей, этот селект выводит 4, их мне нельзя переименовать, а 5, которая не входит в эту выборку, нужно сделать так, чтобы можно было переименовать
...
Рейтинг: 0 / 0
Триггер
    #39572932
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998Ролг Хупин, у меня есть 5 записей, этот селект выводит 4, их мне нельзя переименовать, а 5, которая не входит в эту выборку, нужно сделать так, чтобы можно было переименовать

Я написал уже
"Что такое "нужные" - знаете только вы."

Приведите подробности, структуру, пример
...
Рейтинг: 0 / 0
Триггер
    #39572955
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, у меня есть такие таблицы: факультет, студенты и связь. Связь - ид студента, ид факультета. Мне нужно запретить изменение имени факультета, на котором учится хотя бы один студент. Факультеты, на которых есть студенты я вывожу вот тем селектом.
...
Рейтинг: 0 / 0
Триггер
    #39572990
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998,

http://www.sql.ru/forum/983207/kak-prosit-pomoshhi-s-zaprosom
Пункт номер 2
...
Рейтинг: 0 / 0
Триггер
    #39573010
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

CREATE TABLE "Faculty" ( `fID` NUMBER NOT NULL, `fName` TEXT, `initiation` DATE, `fullName` TEXT, PRIMARY KEY(`fID`) )

CREATE TABLE "Student" ( `sID` NUMBER NOT NULL, `Name` VARCHAR, `lName` VARCHAR, `sName` VARCHAR, `Course` INTEGER CHECK(1 <= Course <= 6), `Birthdates` VARCHAR, `Telephone` VARCHAR, `GPA` INTEGER, `entry` DATE, PRIMARY KEY(`sID`) )

CREATE TABLE `Relationship` ( `sID` NUMBER, `fID` NUMBER, FOREIGN KEY(`sID`) REFERENCES `Student`(`sID`) on delete cascade )


Я прикрепил бд.
...
Рейтинг: 0 / 0
Триггер
    #39573067
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998White Owl,

CREATE TABLE "Faculty" ( `fID` NUMBER NOT NULL, `fName` TEXT, `initiation` DATE, `fullName` TEXT, PRIMARY KEY(`fID`) )

CREATE TABLE "Student" ( `sID` NUMBER NOT NULL, `Name` VARCHAR, `lName` VARCHAR, `sName` VARCHAR, `Course` INTEGER CHECK(1 <= Course <= 6), `Birthdates` VARCHAR, `Telephone` VARCHAR, `GPA` INTEGER, `entry` DATE, PRIMARY KEY(`sID`) )

CREATE TABLE `Relationship` ( `sID` NUMBER, `fID` NUMBER, FOREIGN KEY(`sID`) REFERENCES `Student`(`sID`) on delete cascade )


Я прикрепил бд.Не забывай кнопку SRC. Она прямо над полем текста у форума.
Приведи скрипт наполнения этих трех таблиц данными. Покажи какие конкретно записи надо трогать триггером, а какие не надо. И опиши словами чем эти две группы записей различаются.


Ярослав1998 у меня есть такие таблицы: факультет, студенты и связь. Связь - ид студента, ид факультета. Мне нужно запретить изменение имени факультета, на котором учится хотя бы один студент. Факультеты, на которых есть студенты я вывожу вот тем селектом.
Ты уверен что тебе нужны все три таблицы для этой задачи?

А вообще, по коду:
- Если ты делаешь внешний ключ в Relationship на Student, то почему не делаешь на Faculty?
- Не обрамляй имена таблиц и полей ни в кавычки, ни в апострофы - не нужно это.
- Не надо делать тройные сравнения (1 <= Course <= 6) - это работать не будет.
- В таблице Student, три поля: Name, lName и sName - мой хрустальный шар не может подсказать какие данные ожидаются в этих полях.
- В таблице Student, поле Birthdates - это предполагается что студент рождался три-четыре раза? Может тогда в отдельную таблицу это выделить?
- В таблице Student, поле Birthdates это VARCHAR, а entry DATE. Почему? И кстати, ты знаешь что в sqlite нету типа DATE?
- Почему половина полей начинается с прописной буквы, а половина с заглавной?
...
Рейтинг: 0 / 0
Триггер
    #39573083
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
1) нету внешнего ключа, потому что так было поставлено задание в лабораторной.
2) я не обрамлял, когда создавал. В DB SQLite можно скопировать CREATE любой таблицы
3) у мене этот чек сработал)
4)Имя Фамилия Отчество
5)таблица создана для всех студентов, тоисть у меня не может быть 2 одинаковых студента, знаю, что таблица не совсем правильно построена потому что есть поле Course , а один студент может быть на 2 факультетах, на разных курсах. Закину это поле в таблицу Relationships

остальное- ошибки в процессе обучения, я новичек. Я принимаю и понимаю критику, но не правильные типы и названия полей, не влияют на построение моего триггера) Вопрос был относительно триггера и как наложить его на некоторые значения. Вы можете мне в этом помочь?)
...
Рейтинг: 0 / 0
Триггер
    #39573085
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, а задание звучит так:
создать триггер , который запрещает переименовать факультет, на котором учатся студенты. Мой селект, показывает какие именно значения нельзя изменять.
...
Рейтинг: 0 / 0
Триггер
    #39573108
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998White Owl,
1) нету внешнего ключа, потому что так было поставлено задание в лабораторной.
2) я не обрамлял, когда создавал. В DB SQLite можно скопировать CREATE любой таблицы
3) у мене этот чек сработал)
4)Имя Фамилия Отчество
5)таблица создана для всех студентов, тоисть у меня не может быть 2 одинаковых студента, знаю, что таблица не совсем правильно построена потому что есть поле Course , а один студент может быть на 2 факультетах, на разных курсах. Закину это поле в таблицу Relationships

остальное- ошибки в процессе обучения, я новичек. Я принимаю и понимаю критику, но не правильные типы и названия полей, не влияют на построение моего триггера) Вопрос был относительно триггера и как наложить его на некоторые значения. Вы можете мне в этом помочь?)


ps
новичек->новичок
не правильные типы->неправильные типы
...
Рейтинг: 0 / 0
Триггер
    #39573162
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998White Owl,
1) нету внешнего ключа, потому что так было поставлено задание в лабораторной.То есть задание ТРЕБУЕТ чтобы был один внешний ключ и не было другого?
Ярослав19982) я не обрамлял, когда создавал. В DB SQLite можно скопировать CREATE любой таблицыСкрипты не создают, скрипты пишут. Потому что их потом люди читать будут а "создаватели" добавляют кучу лишней ерунды которая мешает человеческим глазам.
Ярослав19983) у мене этот чек сработал)А ты попробуй задать Course=-10
Ярослав19984)Имя Фамилия ОтчествоСерьезно? А откуда люди это могут узнать? Вот представь что кто-то дал тебе твой скрипт и попросил его "слегка" поправить. Как ты узнаешь что в поле sName надо писать отчество?

Ярослав1998остальное- ошибки в процессе обучения, я новичек. Я принимаю и понимаю критику, но не правильные типы и названия полей, не влияют на построение моего триггера) Вопрос был относительно триггера и как наложить его на некоторые значения. Вы можете мне в этом помочь?)Влияют и очень сильно. Чем грязнее твой код - тем сложнее в нем разобраться. И тем легче допустить ошибки.
...
Рейтинг: 0 / 0
Триггер
    #39573168
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ярослав1998White Owl, а задание звучит так:
создать триггер , который запрещает переименовать факультет, на котором учатся студенты. Мой селект, показывает какие именно значения нельзя изменять.Я не знаю что показывает твой скрипт. Мне он не показывает ничего кроме "syntax error".

Если я правильно понимаю структуру твоей базы, то чтобы узнать есть ли студенты на факультете достаточно посчитать строки в таблице Relationship:
Код: sql
1.
select count(*) from Relationship where fID = номер_факультета


И твоя проверка в триггере будет соответсвенно
Код: sql
1.
where (select count(*) from Relationship where fID = old.fID)>0
...
Рейтинг: 0 / 0
Триггер
    #39573176
Ярослав1998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

спасибо большое)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Триггер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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