|
Задачка
|
|||
---|---|---|---|
#18+
Имеется таблица, содержащая 2 поля: одно целочисленное, другое - текстовое, размер которого позволяет хранить максимальное значение первого поля, преобразованное в текст. Нужно написать триггер, который при вставке и обновлении записи в таблице, если изменяется значение целочисленного поля, преобразовывал бы целочисленной значение в текстовую строку и заменял значение текстового поля. Доп. условия: - первичный ключ не определен - записи добавляются и обновляются по одной У кого будут идеи... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:08 |
|
Задачка
|
|||
---|---|---|---|
#18+
нужно как-то связать 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 но это, конечно, для небольших таблиц ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 13:21 |
|
Задачка
|
|||
---|---|---|---|
#18+
О уникальности значений ничего не сказано, но поскольку первичный ключ не определен, скорее всего, уникальные значения допускаются. А заменять значение текстового поля нужно именно в той записи, в которой обновлено значение числового поля, а не во всех записях, имеющих это значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:07 |
|
Задачка
|
|||
---|---|---|---|
#18+
ну вообще-то существуют задачи, которые невозможно решить а чем плохо если будут изменены все записи? а вообще я не понимаю, зачем делать таблицы без уникального ключа, а потом думать, как извратиться, чтобы работать с ней или Вы знаете ответ и это такой тест? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:16 |
|
Задачка
|
|||
---|---|---|---|
#18+
Да, это вопрос теста, на который мне предложено было найти ответ. За два дня мне не удалось найти ответ... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 14:24 |
|
Задачка
|
|||
---|---|---|---|
#18+
2All А у меня вообще ничего не получилось CREATE TABLE Table1 ( i_v int, s_v char(10) ) В этой таблице патался ввести несколько одинаковых значений, а потом попытался внести в них изменения, естественно ничего не получилось по идее так и должно быть, тогда вопрос, в чём суть теста, если пример заведомо не рабочий. Или может я совсем ламер? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2001, 22:17 |
|
Задачка
|
|||
---|---|---|---|
#18+
используйте СП и не чирикайте народу мозги. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2001, 00:18 |
|
Задачка
|
|||
---|---|---|---|
#18+
Суть теста похоже в том, чтобы сказать тому кто его задал, что он в принципе некорректен. Отрицательный результат тоже результат. Ведь это тест, а не практическая задача. А может все таки Alexander не так понял, например насчет уникальности значений ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2001, 02:58 |
|
Задачка
|
|||
---|---|---|---|
#18+
baxxtor,Slawa же уже сказал, что изменить только одну строку при повторяющихся значениях невозможно. НИКАК. ТАк что хоть SP, хоть триггер, без разницы ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2001, 03:03 |
|
Задачка
|
|||
---|---|---|---|
#18+
СП будет работать только на вставку данных. Для апдейта это работать не будет. Хотелось бы у автора спросить что за задача и почему построена такая таблица при таких условиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2001, 07:40 |
|
Задачка
|
|||
---|---|---|---|
#18+
Изменить только одну строку при повторяющихся значениях можно (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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 14:17 |
|
Задачка
|
|||
---|---|---|---|
#18+
2 VadimB А откуда у Вас уверенность что измениться именно эта строка? Проапдейтиться действительно только одна строка, но необязательно нужная ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 15:02 |
|
Задачка
|
|||
---|---|---|---|
#18+
3 SergSuper Если в таблице есть несколько строк с одинаковыми целыми числами, то мне кажеться все равно какая строчка изменится, главное что, результирующая таблица будет удовлетворять условию задачи ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 16:11 |
|
Задачка
|
|||
---|---|---|---|
#18+
не, читаем условие задачи: "А заменять значение текстового поля нужно именно в той записи, в которой обновлено значение числового поля" 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 то хрен проверишь, та ли строка проапдейтилась или другая может это и есть искомый ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 16:30 |
|
Задачка
|
|||
---|---|---|---|
#18+
"Я про Фому он про Ерему" - порядок строк в реляционной таблице не имеет значения!!! Пусть есть две одинаковые строки в тоблице 1) 111, '111' 2) 111, '111' Предположим после Update будет Первый вариант 1) 111, '111' 2) 222, '222' или Второй вариант 1) 222, '222' 2) 111, '111' Я горорю, что с точки зрения реляционной таблицы, первый вариант ни чем не отличается от второго - порядок строк в реляционной таблице не имеет значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 18:48 |
|
Задачка
|
|||
---|---|---|---|
#18+
Дополняя VadimB: Лучьше даже не писать: 1) 111, '111' 2) 111, '111' потому-что нет строки "1" и строки "2". Прогр., начинающие работать с БД, постоянно говорят о записи 1, 2, ... N; а ведь они неразличимы (точнее, различимы только по содержанию). И тогда задача ставится так: у нас обновилась неизвестно какая запись в табице. Напишите триггер для обновления какой-нибудь записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 19:03 |
|
Задачка
|
|||
---|---|---|---|
#18+
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' попробуйте проверить на досуге С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 19:11 |
|
Задачка
|
|||
---|---|---|---|
#18+
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 оказалось одинаковое Т.е. зависимость от "порядка" зависит от реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2001, 19:48 |
|
Задачка
|
|||
---|---|---|---|
#18+
Ребята, ну посмотрите внимательно что я написал. А вместо этого вы мне пытаетесь доказывать истины, которые я и без вас знаю. Есть конкретная задача, а вы начинаете какие-то абстрактные разговоры о реляционных теориях. Причем здесь вообще кластерные индексы? (Мне так кажется что в теории индексов вообще нет, уж кластерных/некластерных точно. Про ROWCOUNT уже и не говорю.) Давайте прекратим эту бесполезную дискуссию. С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 09:41 |
|
Задачка
|
|||
---|---|---|---|
#18+
Ребяты, а вы, похоже, за бурным обсуждением способа "локализации" записи при помощи 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). Удачи!! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 16:15 |
|
Задачка
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2001, 19:19 |
|
Задачка
|
|||
---|---|---|---|
#18+
To alexeyvg: Можно и добавить проверку на неравенство, можно и добавить проверку на то, что табличка deleted не содержит записей (т.о. пустить обработку insert-a в триггере по другой ветке), можно вообще вставлять значения values (111,'') - тогда триггер сам поставит нужный текст в нужное поле, можно и вообще запретить изменение любого поля, кроме int (чтобы совсем уж ни о чем не думать, и заполнять остальное поле только в триггере). Мне кажется, что это чисто умозрительная задачка из тех, которые называются - "на тему", т.е. не для практического использования, а для проверки "изворотливости ума". Тем более - если такая задачка предлагается кандидату в западной компании перед приемом на работу, то наверняка от человека ожидают 1 поверхностно-правильный ответ (из кучи поверхностно-неправильных), который кто-то когда-то решил записать в ведомость ответов как "правильный"... (так что угадать нам его - не дано). Иначе - как объяснить тот факт, что в предлагаемой структуре данных (повторяющиеся уникальные записи без первичного ключа) вовсю обсуждается возможность изменить 1-ну конкретную строку? "Абсюрд..." ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2001, 09:31 |
|
|
start [/forum/topic.php?fid=46&msg=32003333&tid=1827164]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 413ms |
0 / 0 |