powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка
23 сообщений из 23, страница 1 из 1
Задачка
    #32003125
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица, содержащая 2 поля: одно целочисленное, другое - текстовое, размер которого позволяет хранить максимальное значение первого поля, преобразованное в текст.
Нужно написать триггер, который при вставке и обновлении записи в таблице, если изменяется значение целочисленного поля, преобразовывал бы целочисленной значение в текстовую строку и заменял значение текстового поля.

Доп. условия:
- первичный ключ не определен
- записи добавляются и обновляются по одной


У кого будут идеи...
...
Рейтинг: 0 / 0
Задачка
    #32003127
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно как-то связать inserted с таблицей

если целочисленное значение уникально:

create trigger ... for insert, update
as
update tbl
set str_value=convert(int_value)
from tbl t, inserted i
where t.int_value=i.int_value

если никак не связать

create trigger ... for insert, update
as
update tbl
set str_value=convert(int_value)
from tbl t
where str_value<>convert(int_value) or str_value is null

но это, конечно, для небольших таблиц
...
Рейтинг: 0 / 0
Задачка
    #32003140
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О уникальности значений ничего не сказано, но поскольку первичный ключ не определен, скорее всего, уникальные значения допускаются. А заменять значение текстового поля нужно именно в той записи, в которой обновлено значение числового поля, а не во всех записях, имеющих это значение.
...
Рейтинг: 0 / 0
Задачка
    #32003142
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вообще-то существуют задачи, которые невозможно решить

а чем плохо если будут изменены все записи?
а вообще я не понимаю, зачем делать таблицы без уникального ключа, а потом думать, как извратиться, чтобы работать с ней

или Вы знаете ответ и это такой тест?
...
Рейтинг: 0 / 0
Задачка
    #32003146
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это вопрос теста, на который мне предложено было найти ответ. За два дня мне не удалось найти ответ...
...
Рейтинг: 0 / 0
Задачка
    #32003177
Slawa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2All

А у меня вообще ничего не получилось

CREATE TABLE Table1 (
i_v int,
s_v char(10)
)

В этой таблице патался ввести несколько одинаковых значений, а потом попытался внести в них изменения, естественно ничего не получилось по идее так и должно быть, тогда вопрос, в чём суть теста, если пример заведомо не рабочий.

Или может я совсем ламер?
...
Рейтинг: 0 / 0
Задачка
    #32003179
baxxtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используйте СП и не чирикайте народу мозги.
...
Рейтинг: 0 / 0
Задачка
    #32003180
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть теста похоже в том, чтобы сказать тому кто его задал, что он в принципе некорректен. Отрицательный результат тоже результат. Ведь это тест, а не практическая задача. А может все таки Alexander не так понял, например насчет уникальности значений
...
Рейтинг: 0 / 0
Задачка
    #32003181
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baxxtor,Slawa же уже сказал, что изменить только одну строку при повторяющихся значениях невозможно. НИКАК. ТАк что хоть SP, хоть триггер, без разницы
...
Рейтинг: 0 / 0
Задачка
    #32003192
baxxtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СП будет работать только на вставку данных. Для апдейта это работать не будет. Хотелось бы у автора спросить что за задача и почему построена такая таблица при таких условиях.
...
Рейтинг: 0 / 0
Задачка
    #32003217
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменить только одну строку при повторяющихся значениях можно (SET ROWCOUNT):

create trigger ... for insert, update
as
SET ROWCOUNT 1
update tbl
set str_value=convert(int_value)
from tbl t, inserted i
where t.int_value=i.int_value
SET ROWCOUNT 0
...
Рейтинг: 0 / 0
Задачка
    #32003221
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VadimB

А откуда у Вас уверенность что измениться именно эта строка?

Проапдейтиться действительно только одна строка, но необязательно нужная
...
Рейтинг: 0 / 0
Задачка
    #32003231
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
3 SergSuper
Если в таблице есть несколько строк с одинаковыми целыми числами,
то мне кажеться все равно какая строчка изменится, главное что,
результирующая таблица будет удовлетворять условию задачи
...
Рейтинг: 0 / 0
Задачка
    #32003234
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, читаем условие задачи:
"А заменять значение текстового поля нужно именно в той записи, в которой обновлено значение числового поля"

16 Mar, 2001 14:07:22

но если написать
create trigger ... for insert, update
as
SET ROWCOUNT 1
update tbl
set str_value=convert(int_value)
from tbl t, inserted i
where t.int_value=i.int_value
and i.str_value=t.str_value
SET ROWCOUNT 0
то хрен проверишь, та ли строка проапдейтилась или другая
может это и есть искомый ответ
...
Рейтинг: 0 / 0
Задачка
    #32003247
VadimB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Я про Фому он про Ерему" - порядок строк в реляционной таблице не имеет значения!!!

Пусть есть две одинаковые строки в тоблице
1) 111, '111'
2) 111, '111'

Предположим после Update будет
Первый вариант
1) 111, '111'
2) 222, '222'
или
Второй вариант
1) 222, '222'
2) 111, '111'

Я горорю, что с точки зрения реляционной таблицы, первый вариант ни чем не отличается от второго
- порядок строк в реляционной таблице не имеет значения.
...
Рейтинг: 0 / 0
Задачка
    #32003249
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополняя VadimB:
Лучьше даже не писать:
1) 111, '111'
2) 111, '111'
потому-что нет строки "1" и строки "2".
Прогр., начинающие работать с БД, постоянно говорят о записи 1, 2, ... N; а ведь они неразличимы (точнее, различимы только по содержанию).

И тогда задача ставится так: у нас обновилась неизвестно какая запись в табице. Напишите триггер для обновления какой-нибудь записи.
...
Рейтинг: 0 / 0
Задачка
    #32003250
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VadimB
"...порядок строк в реляционной таблице не имеет значения..."
как умно сказано, я таких и словей-то таких не знаю

но вот вам примерчик, когда порядок строк имеет значение.

create table #t(i int)
insert #t select 1
insert #t select 2
create table #m(i int)
insert #m select 2
insert #m select 1
set rowcount 1
update #t set i=10
update #m set i=10
set rowcount 0
select * from #t
select * from #m

к Вашему удивлению содержимое таблиц #t и #m оказалось разное
Увы, SET ROWCOUNT не очень согласуется с "реляционной теорией"

А могу привести примерчик, когда порядок имеет значение даже без SET ROWCOUNT

И вообще Вы просто невнимательны, то что я предлагал действительно имеет значение
Допустим были бы строки
1) 111, '0111'
2) 111, '111'
и апдейт

update tbl
set int_value=222
where str_value='111'

попробуйте проверить на досуге

С приветом Сергей
...
Рейтинг: 0 / 0
Задачка
    #32003251
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To SergSuper:
В том-то и дело, что "оказалось".
Используя MS документацию, Вы не сможете доказать, какой результат получится после выполнения приведённого скрипта. Естественно, нельзя строить ответственное приложение на основании "сработало сейчас, будет работать и всегда, и на всех версиях"
SET ROWCOUNT согласуется с реляционной теорией. Просто он предназначен для того, что-бы произвести действия над ПРОИЗВОЛЬНЫМ поднабором записей. Критерий выборки данных при установке SET ROWCOUNT - скорость доступа.

Для иллюстрации модифицируем Ваш пример, добавив кластерный индекс:
create table #t(i int)
create clustered index idt_1 on #t(i)
insert #t select 1
insert #t select 2
create table #m(i int)
create clustered index idt_1 on #m(i)
insert #m select 2
insert #m select 1

set rowcount 1
update #t set i=3
update #m set i=3
set rowcount 0

select * from #t
select * from #m

drop table #t
drop table #m

содержимое таблиц #t и #m оказалось одинаковое

Т.е. зависимость от "порядка" зависит от реализации.
...
Рейтинг: 0 / 0
Задачка
    #32003257
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, ну посмотрите внимательно что я написал. А вместо этого вы мне пытаетесь доказывать истины, которые я и без вас знаю.
Есть конкретная задача, а вы начинаете какие-то абстрактные разговоры о реляционных теориях. Причем здесь вообще кластерные индексы? (Мне так кажется что в теории индексов вообще нет, уж кластерных/некластерных точно. Про ROWCOUNT уже и не говорю.)
Давайте прекратим эту бесполезную дискуссию.

С приветом Сергей
...
Рейтинг: 0 / 0
Задачка
    #32003289
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребяты, а вы, похоже, за бурным обсуждением способа "локализации" записи при помощи ROWCOUNT не заметили одной маленькой хитрости, которая присутствует в условии задачки...


А именно - триггер нужно написать на " вставку /изменение"...

Почему именно я выделил тут "вставку" , и почему (ИМХО) именно она важна для решения задачки?

Ведь при желании можно было бы любой процедурой вставки, или даже пользовательским запросом напихать в эту таблицу сколько угодно текстовых представлений числового поля. А ведь только триггер даст нам полную гарантию того, что с момента создания исходной таблицы пока она пустая и до момента, когда сисадмин решит ее дропнуть - данные в ней будут появляться и храниться только при условии сторого соответствия числового поля и поля с конвертированным текстом!

Чуете в чем фишка? Всего-навсего 1 триггер на вставку , а мы уже знаем, что записей, которые имеют разные значения числа и текста в соседних полях, в этой таблице просто физически быть не может...

Т.е. при изменении одной-единственной записи в этой таблице на момент выполнения триггера только одна эта запись и будет иметь значения полей int и convert(int) не только разными , но и в точности равными тем же значениям из таблички inserted, т.е. локализовать "врага" можно простым оператором:

create trigger ... for insert, update
as
update tbl
set t.str_value=convert(i.int_value)
from tbl t, inserted i
where t.int_value=i.int_value and t.str_value=i.str_value

Ну вобщем, идея, вроде бы, достаточно прозрачная... Чтобы все было чики-чик нужно еще позаботиться о том, чтобы поле str_value не допускало значений NULL (чтобы не наступить на грабли сравнения с NULL-ом в "рабочем" update).

Удачи!!
...
Рейтинг: 0 / 0
Задачка
    #32003317
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To qu-qu:
Наверное, надо добавить проверку на неравенство, иначе будут обновляться все записи:
Были:
111, '111'
111, '111'
Вставляем
... values(111, '111')

create trigger ... for insert, update
as
update tbl
set t.str_value=convert(i.int_value)
from tbl t, inserted i
where t.int_value=i.int_value and t.str_value=i.str_value
and convert(varchar,i.int_value) <> i.str_value
...
Рейтинг: 0 / 0
Задачка
    #32003327
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To alexeyvg:

Можно и добавить проверку на неравенство, можно и добавить проверку на то, что табличка deleted не содержит записей (т.о. пустить обработку insert-a в триггере по другой ветке), можно вообще вставлять значения values (111,'') - тогда триггер сам поставит нужный текст в нужное поле, можно и вообще запретить изменение любого поля, кроме int (чтобы совсем уж ни о чем не думать, и заполнять остальное поле только в триггере).

Мне кажется, что это чисто умозрительная задачка из тех, которые называются - "на тему", т.е. не для практического использования, а для проверки "изворотливости ума". Тем более - если такая задачка предлагается кандидату в западной компании перед приемом на работу, то наверняка от человека ожидают 1 поверхностно-правильный ответ (из кучи поверхностно-неправильных), который кто-то когда-то решил записать в ведомость ответов как "правильный"...

(так что угадать нам его - не дано).

Иначе - как объяснить тот факт, что в предлагаемой структуре данных (повторяющиеся уникальные записи без первичного ключа) вовсю обсуждается возможность изменить 1-ну конкретную строку?
"Абсюрд..."
...
Рейтинг: 0 / 0
Задачка
    #32003333
aaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE TABLE Foo (
int_column int NULL ,
char_column AS (convert(varchar(10), int_column))
)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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