Вопрос про T-SQL или PL/SQL

alex_127
Уже с Приветом
Posts: 7723
Joined: 29 Mar 2000 10:01
Location: Kirkland,WA

Re: Вопрос про T-SQL или PL/SQL

Post by alex_127 »

Don Cherry wrote: 04 Sep 2017 16:21
Вячеслав Викторович wrote: 04 Sep 2017 16:03 после инсерта сразу читай @@identity or SCOPE_IDENTITY() и все дела. Hibernate в entity сам после инсерта id заполняет.
в sybase аналогично. в oracle аналогично. не надо изобретать велосипед.
https://msdn.microsoft.com/en-us/librar ... .100).aspx
Если подытожить, для multi-user systems, в самом общем приземлённом варианте,
- PK должен быть auto increment [правильный подход]
- Если PK не auto increment, то дизайн не правильный, надо исправить

Так?

И наверно на этом можно закрыть topic. Да и код можно было не обсуждать, в принципе - делай auto increment, по другому не правильно и трата времени.
Спасибо.
+1
Or PK is guid, or composite of other keys or driven by external logic (say VIN supplied externally).
But not max()+ 1 from table.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Вопрос про T-SQL или PL/SQL

Post by Dmitry67 »

Инкрементация IDENTITY в MS SQL происходит в Autonomous transaction
А вот SELECT MAX(ItemID)+1 FROM MyTable это гарантия, с одной стороны, превращения системы в однопоточную (на первой же долгой транзакции ВСЕ застрянет), а в случае разрыва транзакций бизнеслогикой - race conditions c получением неверного ID.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Вопрос про T-SQL или PL/SQL

Post by Don Cherry »

Dmitry67 wrote: 06 Sep 2017 16:16 Инкрементация IDENTITY в MS SQL происходит в Autonomous transaction
А вот SELECT MAX(ItemID)+1 FROM MyTable это гарантия, с одной стороны, превращения системы в однопоточную (на первой же долгой транзакции ВСЕ застрянет), а в случае разрыва транзакций бизнеслогикой - race conditions c получением неверного ID.
Я думал, что ответ еже получил. А при чём тут autonomous transaction?
В SQL Server создаю table structure
CREATE TABLE Persons (
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
и в моих INSERT НЕ использую "ID", он генерируется автоматически.
Чего-то я опять не понял.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Вопрос про T-SQL или PL/SQL

Post by Dmitry67 »

Don Cherry wrote: 06 Sep 2017 18:11 А при чём тут autonomous transaction?
В SQL Server создаю table structure
CREATE TABLE Persons (
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
и в моих INSERT НЕ использую "ID", он генерируется автоматически.
Чего-то я опять не понял.
Попробуйте сделающее.
insert into persons (lastname, firstname, age) select 'marge','Simpson',35
BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Hole','creator',0
ROLLBACK TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40

Вы увидите что Hole creator но создан (естественно), но между Marge & Homer дырка в нумерации.
Сделано это специально

Иначе следующий код вешал бы все инсерты в таблицу:

BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40
waitfor delay '01:00:00' -- ждем час
ROLLBACK TRAN

А вот код с max()+1 как раз на этом бы и вис.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Вопрос про T-SQL или PL/SQL

Post by Don Cherry »

Dmitry67 wrote: 06 Sep 2017 19:21
Don Cherry wrote: 06 Sep 2017 18:11 А при чём тут autonomous transaction?
В SQL Server создаю table structure
CREATE TABLE Persons (
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
и в моих INSERT НЕ использую "ID", он генерируется автоматически.
Чего-то я опять не понял.
Попробуйте сделающее.
insert into persons (lastname, firstname, age) select 'marge','Simpson',35
BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Hole','creator',0
ROLLBACK TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40

Вы увидите что Hole creator но создан (естественно), но между Marge & Homer дырка в нумерации.
Сделано это специально

Иначе следующий код вешал бы все инсерты в таблицу:

BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40
waitfor delay '01:00:00' -- ждем час
ROLLBACK TRAN

А вот код с max()+1 как раз на этом бы и вис.
Я не достаточно умён, пожалйуста скажите сначала в принципе в чём проблема
- использование IDENTITY в таблице [i.e academical knowledge]
или
- max() + 1 [который я не буду больше использовать]
а потом уже детали и код.
Если второе, зачем об этом разговаривать?
User avatar
Вячеслав Викторович
Уже с Приветом
Posts: 5777
Joined: 13 Feb 2016 18:50
Location: Кемерово

Re: Вопрос про T-SQL или PL/SQL

Post by Вячеслав Викторович »

Don Cherry wrote: 06 Sep 2017 20:50
Dmitry67 wrote: 06 Sep 2017 19:21
Don Cherry wrote: 06 Sep 2017 18:11 А при чём тут autonomous transaction?
В SQL Server создаю table structure
CREATE TABLE Persons (
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
и в моих INSERT НЕ использую "ID", он генерируется автоматически.
Чего-то я опять не понял.
Попробуйте сделающее.
insert into persons (lastname, firstname, age) select 'marge','Simpson',35
BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Hole','creator',0
ROLLBACK TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40

Вы увидите что Hole creator но создан (естественно), но между Marge & Homer дырка в нумерации.
Сделано это специально

Иначе следующий код вешал бы все инсерты в таблицу:

BEGIN TRAN
insert into persons (lastname, firstname, age) select 'Homer','Simpson',40
waitfor delay '01:00:00' -- ждем час
ROLLBACK TRAN

А вот код с max()+1 как раз на этом бы и вис.
Я не достаточно умён, пожалйуста скажите сначала в принципе в чём проблема
- использование IDENTITY в таблице [i.e academical knowledge]
или
- max() + 1 [который я не буду больше использовать]
а потом уже детали и код.
Если второе, зачем об этом разговаривать?
ну охота человеку ещё по теме поговорить. ну пускай ещё что-нибудь скажет
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Это не проблема, а просто особенность, что рано или поздно появятся дырки в последовательностях. Это не вызовет проблем с генерацией нового ключа, а вместо, скажем, 10,11,12,13,14 будет 10,11, 17,18, 21 и это надо знать заранее. Дима об этом и сказал.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Это не лечится никак ни в Оракле, ни в Sybase, ни в MSQL Server. Даже в postgres где можно откатить всё остальное, включая truncate и DDL. Вам уже объснили механизм. Sequence никогда нельзя откатить назад. Cache parameter исключительно для performance и образование дырок он не вылечивает. Попробуйте вставить что-то из sequence и затем откатить транзакцию.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Вопрос про T-SQL или PL/SQL

Post by Dmitry67 »

oleg lebedev wrote: 07 Sep 2017 03:28 Это не лечится никак ни в Оракле, ни в Sybase, ни в MSQL Server. Даже в postgres где можно откатить всё остальное, включая truncate и DDL. Вам уже объснили механизм. Sequence никогда нельзя откатить назад. Cache parameter исключительно для performance и образование дырок он не вылечивает. Попробуйте вставить что-то из sequence и затем откатить транзакцию.
Для OP: Именно, это фича

P.S.
Из занудства отмечу что в MS SQL тоже truncate и DLL откатывается.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Я попробовал сегодня на работе на MS SQL дропнуть таблицу и откатиь и действительно, откатил.
Судя по тому что MS SQL была калька с Sybase, я могу предположить, что Sybase тоже откатывает, правильно?
alex_127
Уже с Приветом
Posts: 7723
Joined: 29 Mar 2000 10:01
Location: Kirkland,WA

Re: Вопрос про T-SQL или PL/SQL

Post by alex_127 »

oleg lebedev wrote: 08 Sep 2017 01:47 Я попробовал сегодня на работе на MS SQL дропнуть таблицу и откатиь и действительно, откатил.
Судя по тому что MS SQL была калька с Sybase, я могу предположить, что Sybase тоже откатывает, правильно?
Sybase and MS SQL can be more different then you and Adam...

http://dcx.sap.com/1001/en/dbrfen10/rf- ... ement.html

Side effects
Automatic commit. Clears the Results tab in the Results pane in Interactive SQL. DROP TABLE, DROP VIEW, DROP MATERIALIZED VIEW, and DROP INDEX close all cursors for the current connection.
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Вопрос про T-SQL или PL/SQL

Post by ALV00 »

oleg lebedev wrote: 07 Sep 2017 03:28 Sequence никогда нельзя откатить назад.
Но можно инициализировать любым числом.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

ALV00 wrote: 08 Sep 2017 16:31
oleg lebedev wrote: 07 Sep 2017 03:28 Sequence никогда нельзя откатить назад.
Но можно инициализировать любым числом.
И как это может помочь в том чтобы решить проблему дырок в последовательностях? Надеюсь, вы не предлагаете инициализировать последовательность на каждой дырке, которая может иметь место в production?
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Вопрос про T-SQL или PL/SQL

Post by ALV00 »

oleg lebedev wrote: 08 Sep 2017 16:35 И как это может помочь в том чтобы решить проблему дырок в последовательностях? Надеюсь, вы не предлагаете инициализировать последовательность на каждой дырке, которая может иметь место в production?
Ну да, дырки штопать только ручками.

ps: а для кого то проблематичны дырки? Я с таким сталкивался только в российском бухучете.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

ALV00 wrote: 08 Sep 2017 16:59
oleg lebedev wrote: 08 Sep 2017 16:35 И как это может помочь в том чтобы решить проблему дырок в последовательностях? Надеюсь, вы не предлагаете инициализировать последовательность на каждой дырке, которая может иметь место в production?
Ну да, дырки штопать только ручками.

ps: а для кого то проблематичны дырки? Я с таким сталкивался только в российском бухучете.
Как правило в этом нет проблем, но есть люди, которые делают свой дизайн на предположении что связь между текущей строчой и следующей всегда будет как NEXT=CURRENT + 1.
Для них открытие дырок в последовательностях может быть очень неприятным.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Вопрос про T-SQL или PL/SQL

Post by Dmitry67 »

Таких людей надо гнать
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Dmitry67 wrote: 08 Sep 2017 19:02 Таких людей надо гнать
Их гонят в дверь, а они через окно.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Lazy444 wrote: 08 Sep 2017 21:13
oleg lebedev wrote: 07 Sep 2017 03:28 Sequence никогда нельзя откатить назад.
Занудства ради : Sequence можно откатить назад :

Code: Select all

SQL> create sequence test_seq;
Sequence created
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         1
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         2
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         3
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         4
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         5
SQL> alter sequence test_seq increment by -4;
Sequence altered
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         1
SQL> alter sequence test_seq increment by 1;
Sequence altered
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         2
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         3
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         4
SQL> select test_seq.nextval from dual;
   NEXTVAL
----------
         5
SQL> drop sequence test_seq;
Sequence dropped

SQL> 
Вы серьёзно, называете это "откатить sequence"? Лучше скажите, что пошутили.
В противном случае, вам надо почитать, что называется транзакцией.
Мне даже не хочется отвечать на эту глупость.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Lazy444 wrote: 08 Sep 2017 22:13 Вы не умеете излагать свои мысли.
A что, по вашему, значит "откатить sequence" ? Если вы имели ввиду, что откатить значение sequence как часть отката транзакции, то об этом надо было написать. Для меня "откатить sequence" означает вернуть значение sequence назад. Вы написали "Sequence никогда нельзя откатить назад." . Ключевое слово "никогда", к которому я придрался и показал вам, что откатить sequence "в моем понимании" можно.

Если говорить про откат транзакций, то можно сделать "flashback database". Откатывает назад все транзакции и все sequence.
А еще можно базу из бэкапа восстановить. Тоже все транзакции и sequence "откатятся" назад.

'Никогда не говори "никогда"' (ц)
Ход ваших мыслей мне понятен.
Первоначально, когда вы упомянули, что я бы у вас не прошёл интервью, я сначала подумал, что вы какой-то senior, страдающий комплексом неполноценности из-за того что никак не плучается выйти на уровень lead, чтобы принимать участие в интервьировании др. кандидатов. Судя по тому, что вы здесь понаписывали вы не дотягиваете до mid level. Скорее всего вы како-то junior.
Люди, которые хоть чуть-чуть знакомы с концепцией relational db никогда не спутают откат транзакции с восстановлением из backup или любого др. метода. Мы тут говорили о том как образуются дырки в последовательностях и это всё было исключительно потому что последовательности в принципе не могут откатиться в транзакции. Поэтому flashback, backup или чего-то другое вообще не к месту.

Не знать что-то - это не стыдно и вам надо просто с этим лучше разобраться. Тут ничего сложного нет. Вот чего вам не надо делать - так это давать оценки и суждения, особенно личностные, там где у вас не хватаем опыта и знаний.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

Lazy444 wrote: 08 Sep 2017 22:55 Ой какие тараканы ... как вас закусило, что интервью вы не пройдете у меня.
Вы хотите пейчеком померятся ? Выкладывайте свой ...
Вы предложили первым померяться, давайте, выкладывайте.
Мне даже интересно сколько junior в Юте получает.
sp123
Уже с Приветом
Posts: 1962
Joined: 24 Feb 2001 10:01
Location: Челябинск -> Everett, WA

Re: Вопрос про T-SQL или PL/SQL

Post by sp123 »

Спокуха, горячие эстонские датабазники! Вы оба не пройдете интервью у меня, а я у вас! И вообще, Lazy444 использовал сарказм, а oleg повелся. Всем бобра!


Sent from my iPhone using Tapatalk Pro
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

sp123 wrote: 09 Sep 2017 01:22 Спокуха, горячие эстонские датабазники! Вы оба не пройдете интервью у меня, а я у вас! И вообще, Lazy444 использовал сарказм, а oleg повелся. Всем бобра!


Sent from my iPhone using Tapatalk Pro
Почитайте пост на 1й странице. Сарказма там не было, во вском случае, я его там не увидел. Был наглый личностный наезд без малейшего на то основания. Человек, как позже выяснилось, мало вообще что-то понимает в базах на что ему и указали. И потом, он что вас попросил защитить его? Я и не собираюсь дискутироывать с этим типом больше, т.к. всё с ним и так ясно.
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Вопрос про T-SQL или PL/SQL

Post by iDesperado »

oleg lebedev wrote: 09 Sep 2017 01:36 Почитайте пост на 1й странице. Сарказма там не было, во вском случае, я его там не увидел. Был наглый личностный наезд без малейшего на то основания. Человек, как позже выяснилось, мало вообще что-то понимает в базах на что ему и указали. И потом, он что вас попросил защитить его? Я и не собираюсь дискутироывать с этим типом больше, т.к. всё с ним и так ясно.
Lazy444 прав, тригеры зло из-за context switch, а ты возбудился совершенно напрасно. и по merge тоже Lazy444 верно сказал.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1879
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Вопрос про T-SQL или PL/SQL

Post by oleg lebedev »

iDesperado wrote: 09 Sep 2017 09:29
oleg lebedev wrote: 09 Sep 2017 01:36 Почитайте пост на 1й странице. Сарказма там не было, во вском случае, я его там не увидел. Был наглый личностный наезд без малейшего на то основания. Человек, как позже выяснилось, мало вообще что-то понимает в базах на что ему и указали. И потом, он что вас попросил защитить его? Я и не собираюсь дискутироывать с этим типом больше, т.к. всё с ним и так ясно.
Lazy444 прав, тригеры зло из-за context switch, а ты возбудился совершенно напрасно. и по merge тоже Lazy444 верно сказал.
Может уже хватит толочь воду в ступе? Если это зло, то не используйте это и многое другое, что влияет негативно на performance. Кроме performance есть и ещё др. аспекты to consider.
Инженерные решения - это почти всегда компромисы между тем или иным. Если вы верите, что триггеры абсолютное зло - то напишите в Оракл чтобы их убрали, естественно с обоснованием. Если убедите, то они их уберут, ведь это сделает их продукт лучше. А здесь писать об этом в столь категоричной форме - признак профанации и непонимание мест приложений этого объекта.
User avatar
Вячеслав Викторович
Уже с Приветом
Posts: 5777
Joined: 13 Feb 2016 18:50
Location: Кемерово

Re: Вопрос про T-SQL или PL/SQL

Post by Вячеслав Викторович »

oleg lebedev wrote: 09 Sep 2017 13:28 Может уже хватит толочь воду в ступе?
пора обнажить шпаги :twisted:

Return to “Вопросы и новости IT”