Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Написание триггера.  [new]
sqlfool
Member

Откуда:
Сообщений: 9
Добрый день, нужно написать триггер:

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

подскажите, как вообще реализован поиск по записям в таблице, и как выбрать только одну запись и внутри нее что-то менять.

К сообщению приложен файл. Размер - 7Kb
20 окт 19, 18:00    [21998346]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 527
Перехватываете INSERT (триггер INSTEAD OF), пишете свою логику.

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

Поиск - это WHERE (ещё есть HAVING). Изменить запись - UPDATE. Вставить - INSERT.
20 окт 19, 18:33    [21998357]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
sqlfool,

довольно сложная задача для начинающего. Если Вы добрались до триггеров, то должны изучить понятие запросов, их разновидностей, принципов организации хранения реляционных данных, понятие типа данных, понятие транзакции и так далее. Но, судя по вопросам, Вы "плаваете" в материале.
21 окт 19, 13:12    [21998942]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
sqlfool
Member

Откуда:
Сообщений: 9
Владислав Колосов,

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


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


Сообщение было отредактировано: 21 окт 19, 17:39
21 окт 19, 17:35    [21999277]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
sqlfool,

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

Во-первых, в триггере доступны виртуальные таблицы inserted / deleted, через которые можно получить доступ к модифицированным операцией записям.
Во-вторых, забудьте про циклы. Все далается парой команд.
21 окт 19, 17:42    [21999283]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
sqlfool,

триггер после выполнения срабатывает, когда произошли изменения всех строк в запросе. То есть в поле зрения триггера попадает не одна строка, а сразу весь объём строк. Присваивая значения переменным, Вы можете потерять информацию. Для получения доступа к старым значениям служит, как уже писали, таблица под именем deleted, к новым значениям - inserted.
21 окт 19, 18:03    [21999291]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 527
Гавриленко Сергей Алексеевич
Это ужасно, выкидывайте и больше никому не показывайте.

Это не так страшно. Я видел намного страшнее Картинка с другого сайта.

sqlfool, sql - это декларативный язык. Ему не нужно алгоритм писать. Поэтому циклы и курсоры используют только в самых крайних ситуациях.
21 окт 19, 21:55    [21999391]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера.  [new]
sqlfool
Member

Откуда:
Сообщений: 9
большое спасибо всем за помощь, задачка оказалось не такой сложной!
21 окт 19, 23:01    [21999412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить