Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30

Не работает триггер

24.03.2015, 13:11. Показов 4292. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица Сотрудники_организации в ней поля (Табельный_номер(PK), Фамилия, Имя, Отчество, Дата_рождения,
Должность, Домашний_адрес, Название_отдела). К таблице нужно привязать триггер который будет запрещать добавлять записи в таблицу, если возраст принимаемого на работу не достиг 18-летнего возраста. Код самого триггера:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER pr_vozrasta
ON dbo.Сотрудники_организации
FOR INSERT
AS
DECLARE @vz int
DECLARE @vz1 int
@vz = Year(inserted.Дата_рождения)
@vz1 = Year(getdate())
IF (@vz1-@vz)<18
BEGIN 
print 'Невозможно принять на работу несовершеннолетнего'
rollback transaction
end
При выполнении возникают следующие ошибки:
Сообщение 102, уровень 15, состояние 1, процедура pr_vozrasta, строка 7
Неправильный синтаксис около конструкции "@vz".
Сообщение 137, уровень 15, состояние 2, процедура pr_vozrasta, строка 9
Необходимо объявить скалярную переменную "@vz1".

Я понимаю что код не очень но прийти к истине не могу. Помогите пожалуйста!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2015, 13:11
Ответы с готовыми решениями:

Триггер не работает
Добрый вечер! Есть таблица, она не должна хранить одинаковые строки с точки зрения трех полей. одно из этих полей smalldatetime, которое...

Не работает триггер
Добрый вечер всем. Следующая проблема: нужно написать триггер, реализующий следующую логику - при изменении значения в столбце budget...

не работает триггер
Доброго дня. Где я ошибся ? CREATE trigger newtable_biu0 for newtable active before insert or update position 0 as declare...

12
 Аватар для carga2
11 / 9 / 6
Регистрация: 07.11.2013
Сообщений: 335
24.03.2015, 13:18
предполагаю так
Цитата Сообщение от Sashura Посмотреть сообщение
set @vz = Year(inserted.Дата_рождения)
set @vz1 = Year(getdate())
0
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30
24.03.2015, 13:21  [ТС]
Изменил на
T-SQL
1
2
set @vz = Year(inserted.Дата_рождения)
set @vz1 = Year(getdate())
. Появилась новая ошибка:
Сообщение 4104, уровень 16, состояние 1, процедура proverka_plat, строка 7
Не удалось привязать составной идентификатор "inserted.Дата_рождения".
0
 Аватар для carga2
11 / 9 / 6
Регистрация: 07.11.2013
Сообщений: 335
24.03.2015, 13:29
Цитата Сообщение от Sashura Посмотреть сообщение
@vz = Year(inserted.Дата_рождения)
заменить на
T-SQL
1
set @vz=(select Year(Дата_рождения) from inserted)
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30
24.03.2015, 13:37  [ТС]
Все заработало! Спасибо вам большое! И еще не могли бы вы объяснить зачем в
T-SQL
1
set @vz=(select Year(Дата_рождения) from inserted)
оператор
T-SQL
1
SELECT
. Это же оператор выборки, зачем тут выбирать?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
24.03.2015, 13:39
Лучше скажите, сможет ли скалярная переменная @vz вобрать в себя один миллион значений из таблицы inserted?
И что скажет сервер, если SET пытается присвоить этой переменной более одного значения из подзапроса?
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30
24.03.2015, 13:55  [ТС]
Добавлено через 10 минут
Так при добавлении запросом INSERT я добавляю одну строку, и в этой одной строке всего лишь одна запись Дата_рождения! Или я не так что-то понимаю, и если есть select то должно быть тогда условие WHERE которая выберет именно нужную мне запись
0
 Аватар для carga2
11 / 9 / 6
Регистрация: 07.11.2013
Сообщений: 335
24.03.2015, 13:55
Судя по данной задаче, записи будут добавляться ручками из клиентского приложения и в таблице INSERTED будет одна запись. Но, в другом случае, в таблице INSERTED может находиться сколь угодно много записей и тогда данная реализация не подойдет.
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30
24.03.2015, 13:57  [ТС]
А ну теперь понятно! На сколько я понял Сервер таким образом страхуется
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
24.03.2015, 13:59
Цитата Сообщение от carga2 Посмотреть сообщение
Судя по данной задаче, записи будут добавляться ручками из клиентского приложения и в таблице INSERTED будет одна запись. Но, в другом случае, в таблице INSERTED может находиться сколь угодно много записей и тогда данная реализация не подойдет.
Где гарантия, что будет всегда одна запись?
Автор текста триггера мамой клянётся?
1
 Аватар для carga2
11 / 9 / 6
Регистрация: 07.11.2013
Сообщений: 335
24.03.2015, 14:04
Цитата Сообщение от iap Посмотреть сообщение
Где гарантия, что будет всегда одна запись?
Автор текста триггера мамой клянётся?
ну да, нет гарантий, я согласна.
Не проще ли тогда создать ограничение на поле [Дата_рождения] при создании таблицы?
1
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 30
24.03.2015, 14:08  [ТС]
Сделал еще один триггер в другой таблице запрещающий добавление записей в воскресенье. Можете посмотреть в чем опять ошибка
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
ALTER TRIGGER [dbo].[proverka_plat]
ON [dbo].[Платежи]
FOR INSERT  
AS
DECLARE @data datetime
DECLARE @data2 nvarchar(15)
set @data = (select Дата_платежа from inserted)
Set @data2 = (datename(dw,@data))
IF  @date2 in 'Sunday'
begin 
print 'Запрещено добавлять платежи в воскресенье'
rollback transaction
end
Триггер должен запрещать добавление записей в воскресенье

Добавлено через 1 минуту
Ошибка:
Сообщение 137, уровень 15, состояние 2, процедура proverka_plat, строка 9
Необходимо объявить скалярную переменную "@date2".
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
25.03.2015, 08:48
ну как-то @date2 и @data2 суть разные имена, не?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2015, 08:48
Помогаю со студенческими работами здесь

Не работает триггер
Всем привет! Написал триггер, но он не срабатывает, в чем может быть причина? Код: create trigger u_dep_col_sotr after update on...

Не работает триггер
По заданию нужно создать триггер, который при выполнении функции INSERT для таблицы 1 вставлял бы в таблицу 2 количество строк в таблице 1....

Не работает триггер AFTER INSERT
При появлении записи в таблице Users триггер должен вставлять запись в таблицу Validation. Все таблицы, связи, последовательности создаются...

Не работает триггер в MySQL
Ребята, подскажите, что делаю не так? Есть процедура CREATE DEFINER=`admin`@`%` PROCEDURE StatForCall () BEGIN SET...

Триггер не правильно работает
При заполнении таблицы zamovlennya говорит что поля NEW.zamovlennya.tarif_has_company_tarif_id_tarif не существует. Да его не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru