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

Откуда:
Сообщений: 4
Почитал многое, но так и не разобрался что мне следует сделать.
Завтра зачет у Повышева. Дал задание написать триггер. Чтобы поле name состояло только из букв.
Вроде правильно написал, должен выдавать ошибку о том что какое то поле содержит цифры.
Но что то не то, не могу разобрать.
Я добавлял данные
insert into week ( id, name ) values ( 10, '123');
он мне переименовал их все в 123.


create trigger trig1
on week
instead of insert
as
begin
declare @i varchar(50)

select @i = Name from inserted
if @i like '0123456789' raiserror ('ONLY LETTERS', 16, 1),
else update week
set Name = @i
end
20 июн 12, 01:07    [12742492]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
1) select @i = Name from inserted
Такая инструкция выдаст ошибку при массовых вставках

2) instead of insert
Данный триггер срабатывает вместо вашей конструкции

3) Ваш лайк явно ошибочный

4) update week
set Name = @i
обновление по всей таблице(!) без условия

5) триггер тут вообще не нужен, подобные задачи решаются с помощью констрейнтов
20 июн 12, 07:53    [12742833]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Knyazev Alexey,
Knyazev Alexey
1) select @i = Name from inserted
Такая инструкция выдаст ошибку при массовых вставках

не выдаст,но отработает не корректно
+

declare @t table ( id int )
declare @i int
insert  into @t
        ( id )
values  ( 1 )
,       ( 2 )
select  @i = id
from    @t
select  @i

20 июн 12, 09:01    [12743009]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Romadgd
Member

Откуда:
Сообщений: 4
alter trigger ISK 
on week for insert
as
begin
declare @id int
select @id=max(id) from inserted
declare @nm varchar(100)
select @nm=name from inserted	
if @nm  raiserror ('ONLY LETTERS', 1, 1)
else update week set @nm=name 
where id=@id
end


Довел триггер до такой кондиций
20 июн 12, 09:17    [12743072]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
denis2710
Knyazev Alexey,
Knyazev Alexey
1) select @i = Name from inserted
Такая инструкция выдаст ошибку при массовых вставках

не выдаст,но отработает не корректно
Отработает корректно, то есть в соответствии с BOL.
Присвоит @i значение из последней строки, выбранной сервером в процессе выпролнения SELECT
20 июн 12, 09:18    [12743078]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
iap, слово "некорректно" в данном случае некорректно :)
великий грех всех программ перед программистом,то что они делают то,что он написал,а не то
что он имел ввиду.

Romadgd, вы опять пишите триггер для одиночной вставки.
select @nm=name from inserted

Смысл обновлять только у максимального id
И че работает????
if @nm  raiserror ('ONLY LETTERS', 1, 1)
20 июн 12, 09:29    [12743138]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Romadgd
Member

Откуда:
Сообщений: 4
Извините скопировал не так
if @i like '[0123456789]' raiserror ('ONLY LETTERS', 16, 1)

должно выглядеть так

На счет одиночной, что следует сделать?
20 июн 12, 09:40    [12743197]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Romadgd
Извините скопировал не так
if @i like '[0123456789]' raiserror ('ONLY LETTERS', 16, 1)

должно выглядеть так

На счет одиночной, что следует сделать?
1. То есть, по-Вашему получаеится, что @i не может состоять из одной цифры? Всё остальное - можно?
2. А разве все символы делятся только на две группы - буквы и цифры?
3. Не используйте в триггере скалярные переменные. Сказали же уже.
20 июн 12, 09:46    [12743236]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Romadgd,
+ что-то в таком духе

create trigger trig1
on week
instead of insert
as
begin
if exists(select 1 from inserted where patindex('%[0-9]%',Name ) =0 )
begin
raiserror ('Don''t use digital!!!', 16, 1);
return
end;
update w
set
Name = i.name
from week w
inner join inserted i on i.id = w.id
end

20 июн 12, 10:47    [12743789]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
2denis2710

Неправильно, таблица так и останется пустой :-(

Лучьше по простому:
create trigger trig1
on week
for insert, update
as
begin
  if exists(select 1 from inserted where Name like '%[0-9]%')
    raiserror ('Don''t use digital!!!', 16, 1);
end
20 июн 12, 10:57    [12743885]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
alexeyvg
Лучьше по простому:

да не нужен тут триггер вообще, всё рулится чеками :)
20 июн 12, 11:00    [12743918]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Knyazev Alexey
alexeyvg
Лучьше по простому:

да не нужен тут триггер вообще, всё рулится чеками :)
Неправильно.

Нужен триггер, потому что задание преподавателя - написать триггер :-)

Конечно, нужно обязательно упомянуть в решении, что более правильный подход - чек-констрейн и написать его. Это уже на пятёрку :-)
20 июн 12, 11:04    [12743953]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
alexeyvg
2denis2710

Неправильно, таблица так и останется пустой :-(

Лучьше по простому:
create trigger trig1
on week
for insert, update
as
begin
  if exists(select 1 from inserted where Name like '%[0-9]%')
    raiserror ('Don''t use digital!!!', 16, 1);
end



Точно ведь не проверяли :-)

Ошибку то оно выдаст, но и запись вставит ;-)

use tempdb
create table dbo.a (id int identity, name nvarchar (20))

create trigger trig1
on dbo.a
for insert, update
as
begin
  if exists(select 1 from inserted where Name like '%[0-9]%')
    raiserror ('Don''t use digital!!!', 16, 1)
end

insert into dbo.a values('aaaa'),('aaab'),('122adf')


select * from dbo.a
20 июн 12, 11:23    [12744146]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
я бы так сделал...

Если по простому :-)

USE tempdb
GO
IF OBJECT_ID ('dbo.a') IS NOT NULL DROP TABLE dbo.a
GO
CREATE TABLE dbo.a (id INT IDENTITY, name NVARCHAR (20))
GO

CREATE TRIGGER trig1
ON dbo.a
INSTEAD OF INSERT
AS
BEGIN
	INSERT INTO dbo.a
	SELECT i.Name FROM inserted i
	WHERE i.Name NOT LIKE '%[0-9]%'
END
GO

INSERT INTO dbo.a VALUES('aaaa'),('aaab'),('122adf')
GO

SELECT * FROM dbo.a
20 июн 12, 11:30    [12744228]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
где
Guest
Andrey Sribnyak,
а где же "должен выдавать ошибку о том что какое то поле содержит цифры"?
20 июн 12, 11:35    [12744278]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
где
Andrey Sribnyak,
а где же "должен выдавать ошибку о том что какое то поле содержит цифры"?


А задание читали? ;-)

автор
Завтра зачет у Повышева. Дал задание написать триггер. Чтобы поле name состояло только из букв.


Где в условии должна быть ошибка? ;-)
20 июн 12, 11:38    [12744316]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Andrey Sribnyak
Точно ведь не проверяли :-)

Ошибку то оно выдаст, но и запись вставит ;-)
А, ну да, роллбак ещё нужен...

Ну ничего, должна же быть хоть одна ошибка в решении, а то получится, что студент умнее преподавателя, а это 2 :-)
20 июн 12, 11:45    [12744421]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
alexeyvg
Andrey Sribnyak
Точно ведь не проверяли :-)

Ошибку то оно выдаст, но и запись вставит ;-)
А, ну да, роллбак ещё нужен...

Ну ничего, должна же быть хоть одна ошибка в решении, а то получится, что студент умнее преподавателя, а это 2 :-)
В триггере INSTEAD OF INSERT ROLLBACK не нужен.
20 июн 12, 11:48    [12744452]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
alexeyvg
Andrey Sribnyak
Точно ведь не проверяли :-)

Ошибку то оно выдаст, но и запись вставит ;-)
А, ну да, роллбак ещё нужен...



Тогда из-за условия
if exists(select 1 from inserted where Name like '%[0-9]%')

откатит всю транзакцию, а нам нужно откатить только неправильное значение
20 июн 12, 11:48    [12744461]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вот только в задании говорится про буквы, а решения предлагаются с использованием понятия "цифра"!
Ай-яй-яй!
20 июн 12, 11:50    [12744478]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
Romadgd
Member

Откуда:
Сообщений: 4
[TSQL]CREATE TRIGGER trig1
ON week
instead OF INSERT
AS
BEGIN
DECLARE @nm VARCHAR(50)

SELECT @nm = Name FROM inserted
IF (@nm LIKE '%[0-9]%') raiserror('ONLY_LETTERS',1,1)
ELSE UPDATE week
SET Name = @nm
END[/TSQL][/QUOTE]

Работающий триггер, но суть в том, что он переименовывает предыдущие записи, в последнюю добавленную.
22 июн 12, 01:53    [12757041]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Переименовал все значения  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Romadgd
[TSQL]CREATE TRIGGER trig1
ON week
instead OF INSERT
AS
BEGIN
DECLARE @nm VARCHAR(50)

SELECT @nm = Name FROM inserted
IF (@nm LIKE '%[0-9]%') raiserror('ONLY_LETTERS',1,1)
ELSE UPDATE week
SET Name = @nm
END[/TSQL]


Работающий триггер, но суть в том, что он переименовывает предыдущие записи, в последнюю добавленную.[/quot]
как написали так он и работает 12743078.
Вы ответы игнорируете? Вам уже говорили,что это говночудо код не будет работать как вам нужно

Knyazev Alexey
2) instead of insert
Данный триггер срабатывает вместо вашей конструкции
3) Ваш лайк явно ошибочный

4) update week
set Name = @i
обновление по всей таблице(!) без условия
22 июн 12, 09:12    [12757434]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить