powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написание триггера.
8 сообщений из 8, страница 1 из 1
Написание триггера.
    #39878883
sqlfool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, нужно написать триггер:

В таблице grave при
a. при Insert срабатывает триггер, который вычисляет сколько осталось места на кладбище, если могила занимает больше места чем осталось на кладбище, то могила будет создана на кладбище, где есть место.

подскажите, как вообще реализован поиск по записям в таблице, и как выбрать только одну запись и внутри нее что-то менять.
...
Рейтинг: 0 / 0
Написание триггера.
    #39878892
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перехватываете INSERT (триггер INSTEAD OF), пишете свою логику.

Разбейте задачу на части, пишите каждые части в отдельности, потом склеете всё в один триггер... В общем-то как и решается любая другая задача. Для начала напишите запрос, который вычисляет сколько осталось места на кладбище... Так сказать начните! Потом ещё одну какую-то мелочь...

Поиск - это WHERE (ещё есть HAVING). Изменить запись - UPDATE. Вставить - INSERT.
...
Рейтинг: 0 / 0
Написание триггера.
    #39879274
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfool,

довольно сложная задача для начинающего. Если Вы добрались до триггеров, то должны изучить понятие запросов, их разновидностей, принципов организации хранения реляционных данных, понятие типа данных, понятие транзакции и так далее. Но, судя по вопросам, Вы "плаваете" в материале.
...
Рейтинг: 0 / 0
Написание триггера.
    #39879521
sqlfool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Эх, так оно и есть. В универе это вторая лаба, то есть до этого мы только создавали таблички, вставляли в них данные и все.
Написал что-то, но оно не работает. Посмотрите? Только сильно не стоит пугаться, это мой первый триггер так сказать.


Код: sql
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
USE Кладбище
GO

CREATE TRIGGER InsertGrave
ON Grave
AFTER INSERT
AS
DECLARE @POSITION  int; -- id могилы
SET @POSITION = @@IDENTITY;
DECLARE @CoffinID int; 
SET @CoffinID = (SELECT Grave.coffin_id FROM grave where grave.id = @POSITION)
DECLARE @AREA1 int; --пдлощадь гроба
SET @AREA1 = (SELECT coffin.area FROM coffin WHERE coffin.id = @CoffinID)
DECLARE @POSITION1  int; --id кладбища
SET @POSITION1 = (SELECT grave.grave_id FROM grave WHERE grave_id = @POSITION)
DECLARE @AREA int; --площадь кладбища
SET @AREA = (SELECT Graveyard.area FROM Graveyard WHERE Graveyard.id = @POSITION1)
IF @AREA > @AREA1
	BEGIN
	UPDATE Graveyard
	SET area = area - @AREA1
	Select * FROM Graveyard WHERE Graveyard.id = @POSITION1
END
ELSE
	DECLARE @i INT;
	SET @i = 1;
	DECLARE @i1 INT;
	SET @i1 = 0;
	WHILE @i1 = 0
		BEGIN
		DECLARE @AREA2 INT;
		SET @AREA2 = (SELECT Graveyard.area FROM Graveyard WHERE Graveyard.id = @i)
		IF @AREA2 > @AREA1
			BEGIN
			UPDATE Graveyard
			SET area = area - @AREA1
			Select * FROM Graveyard WHERE Graveyard.id = @i


			UPDATE Grave
			SET grave_id = @i;
			Select * FROM Grave WHERE Grave.id = @POSITION

			set @i1 = 1; 
		END
		SET @i = @i + 1;
	END
go
...
Рейтинг: 0 / 0
Написание триггера.
    #39879524
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfool,

Это ужасно, выкидывайте и больше никому не показывайте.

Во-первых, в триггере доступны виртуальные таблицы inserted / deleted, через которые можно получить доступ к модифицированным операцией записям.
Во-вторых, забудьте про циклы. Все далается парой команд.
...
Рейтинг: 0 / 0
Написание триггера.
    #39879531
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfool,

триггер после выполнения срабатывает, когда произошли изменения всех строк в запросе. То есть в поле зрения триггера попадает не одна строка, а сразу весь объём строк. Присваивая значения переменным, Вы можете потерять информацию. Для получения доступа к старым значениям служит, как уже писали, таблица под именем deleted, к новым значениям - inserted.
...
Рейтинг: 0 / 0
Написание триггера.
    #39879603
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичЭто ужасно, выкидывайте и больше никому не показывайте.
Это не так страшно. Я видел намного страшнее


sqlfool, sql - это декларативный язык. Ему не нужно алгоритм писать. Поэтому циклы и курсоры используют только в самых крайних ситуациях.
...
Рейтинг: 0 / 0
Написание триггера.
    #39879618
sqlfool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
большое спасибо всем за помощь, задачка оказалось не такой сложной!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написание триггера.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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