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

Откуда:
Сообщений: 38
Добрый день!
Бьюсь уже час, руки опускаются.
Скажите, что я делаю не так.
Есть 2 похожие таблицы отличаются только 1-2 колонками
Надо написать триггер на insert. При добавлении записи в одну таблицу вставить эти записи и в другую таблицу, а так же в колонку DateCome добавить дату добавления

CREATE TRIGGER tr_insert ON Student
AFTER INSERT
AS
BEGIN
INSERT INTO CameLeft (NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone) 
SELECT NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone From Inserted
INSERT INTO CameLeft(DateCome)
VALUES (GETDATE())
END
GO


при выполнении
INSERT INTO Student (NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone, NumberOfRoom) 
VALUES(1231223,'asd','gre','gtr','1993-09-26','fger','qwe','fer',34,45,12);

пишет:
Сообщение 515, уровень 16, состояние 2, процедура tr_insert, строка 7
Не удалось вставить значение NULL в столбец "NS", таблицы "kurs.dbo.CameLeft"; в столбце запрещены значения NULL. Ошибка в INSERT.
Почему NULL? все же верно вроде)))))
7 дек 13, 15:58    [15257993]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
А почему два INSERT-а?
7 дек 13, 16:10    [15258051]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
jacky22
Почему NULL? все же верно вроде)))))

Потому что 2 команды INSERT добавляют 2 записи

CREATE TRIGGER tr_insert ON Student
AFTER INSERT
AS
BEGIN
INSERT INTO CameLeft (NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone,DateCome)
SELECT NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone,GETDATE() From Inserted
END
GO
7 дек 13, 16:10    [15258054]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
jacky22,

во втором INSERT вставляется NULL.
Зачем этот второй INSERT - непонятно.
СREATE TRIGGER tr_insert ON Student AFTER INSERT AS
INSERT CameLeft (NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone,DateCome) 
SELECT NS,[Fist Name],[Last Name],[Second Name],[Born Day],Sex,Faculty,Specialty,Course,Phone,GETDATE()
FROM inserted;
Но более правильно создавать поле DateCome с
CONSTRAINT dCameLeftDateCome DEFAULT GETDATE()
Тогда в INSERT это поле писать вообще не надо.
7 дек 13, 16:14    [15258076]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
jacky22
Member

Откуда:
Сообщений: 38
блин! точно! спасибо большое! голова совсем не варит уеж
7 дек 13, 16:32    [15258142]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
jacky22
Member

Откуда:
Сообщений: 38
Тут ещё вопрос по ходу появился.
Как в ms sql сделать такое:
есть 2 таблицы
tab1
id name age
tab2
id name age col


мне надо во 2ую таблицу вставить name и age из первой, а col заполнить от руки.(id известен заранее, пусть будет 13)

Думал что-то такое, но тут явно синтаксис не правильный

INSERT INTO Tab2(id, name, age, col)
VALUES (13,(SELECT tab1.name, tab1.age FROM tab1
WHERE tab1.id = 407196), 'asd')
Т.е по сути надо по известному id вытащить name и age записи из tab1 с эквивалентным id
7 дек 13, 19:20    [15258624]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
jacky22,

INSERT ... SELECT ... FROM ... JOIN ...

Вы полагаете, что в INSERT может быть только VALUES()?
Почему бы не прочитать про INSERT в документации?
http://msdn.microsoft.com/ru-ru/library/ms174335(v=sql.100).aspx
7 дек 13, 19:41    [15258671]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
pio777
Member

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

INSERT INTO Tab2(id, name, age, col)
SELECT 13, tab1.name, tab1.age, 'asd' FROM tab1 WHERE tab1.id = 407196
7 дек 13, 21:41    [15258904]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
jacky22
Member

Откуда:
Сообщений: 38
Спасибо всем за помощь!

Надеюсь это последний вопрос.
есть таблица в ней даты оплат и кол-во
надо проссумировать все по месяцам

Получилось только вывести по месяцам все оплаты
SELECT AmountOfPay, PayDate=MONTH(PayDate) FROM Payment GROUP BY AmountOfPay, MONTH(PayDate)


а как их просуммировать пока не пойму. Подскажите пожалуйста
8 дек 13, 16:38    [15260596]     Ответить | Цитировать Сообщить модератору
 Re: insert триггер  [new]
pio777
Member

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

SELECT PayDate=MONTH(PayDate),  SUM(AmountOfPay) FROM Payment GROUP BY MONTH(PayDate)
8 дек 13, 19:07    [15261063]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить