powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опять вопрос по IDENTITY
25 сообщений из 26, страница 1 из 2
Опять вопрос по IDENTITY
    #32008080
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На клиенте надо знать значение только что вставленного ID.
insert into MyTable (Filed) values ('qqq')
select @I = ident_current('MyTable')
Этот код конечно по helpу вернет, то что мне надо, НО если между insert и select кто-то вставит запись, вернется ли мне мной вставленное ID.
Я помню дискуссию про @@IDENTITY. Оно мне не подходит потому что триггера на insert тоже могут вставлять куда-то записи.
И еще одно кто занет как можно прочитать вставленное id из ADO компонентов.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008092
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slava, ну тебе же Alexander Chepack ответил уже - SCOPE_IDENTITY().
Т.е.
insert into MyTable (Filed) values ('qqq')
select @I = SCOPE_IDENTITY()

Пусть другие сессии хоть завставляются - тебе вернется значение счетчика именно твоего Insert'а.

И про какие именно компоненты ты говоришь? Одно дело сохраненная процедура, другое серверный рекордсет, третье - клиентский. Уточни.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008097
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Microsoftовские клиенты все через ADO с сервером работают. Про них и говорю. В Delphi это TADOQuery, TADOStoredProc and so on.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008099
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам то понял, что написал? Что за микрософтовские клиенты?

Slava, извини, я посчитал что это ты автор ветки http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1523 В ней вроде все обговорили на эту тему. Посмотри, может предложенные решения тебя устроят. А те компоненты, которые ты перечислил могут возвращать набор записей (Recordset), а могут и не возвращать. В последнем случае можно получить значение счетчика через выходной параметр сохраненной процедуры или через код ее завершения (если тебе нужно, к примеру, загнать это значение в переменную). Вот я попросил тебя уточнить, что именно ты собираешся делать с этим значением.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008120
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VB and C++ могут быть клиентами ну конечно как бы в переносном смысле.
Ну я этот парметр хочу загнать в Delphi переменную. Вот например есть там TADOQuery я пишу
TADOQuery.SQL.Text := 'insert into MyTable values (''Хочу последний ID'')';
TADOQuery.Open;
И вот где теперь мне его читать?
Вот такой код конечно походит мне
ADOQuery1.SQL.Text := 'declare @I int ' +
'insert into Table1(Text) values (''' + Str + ''') ' +
'select @I = scope_identity() select @I as ''Вот последний ID''';
ADOQuery1.Open;
но я хочу быть "круче".
Через выходной параметр процедуры и код ее завершения не хочу, потому как неохото лишнюю процедуру писать
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008127
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Через выходной параметр процедуры и код ее завершения не хочу, потому как неохото лишнюю процедуру писать
Это Вы, батенька, напрасно... Количество "клиентских" запросов нужно вседа минимизировать и использовать SP где только можно.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008128
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
зы: особенно, если "хотите быть круче"
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008131
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>VB and C++ могут быть клиентами ну конечно как бы в переносном смысле.

Сами языки даже в переносном смысле не клиенты. А вот программы, на них написанные, могут вполне быть клиентскими приложениями. И кроме ADO ходить к серверу через DB-Lib, ODBC, OLEDB.

>но я хочу быть "круче".

Будь круче. Открывай рекордсет, в качестве источника которого что-то типа

'insert into Table1(Text) values (''' + Str + ''') select scope_identity() as ''[Вот последний ID]''';

Открывай рекордсет, и в поле [Вот последний ID] бери искомое.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008179
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИМХО, это изврат. ЗАЧЕМ перегружать бд-клиента той логикой, которую можно возложить на SQL-Server??? А если клиента пишет, скажем веб-дизайнер, имеющий мин. представления о БД? Или наоборот бд-девелопер не шарит веб-дизайне? (веб-прил. - это только один из возможных примеров). Или, скажем, придется все переделывать под какой-нить оракль? К тому же, вдруг этот хренов дельфи когда-нибудь Славу достанет, и он закинет его подальше вместе со всеми этими TTable и TQuery в аасортименте ? "Тонкий клиент" - он хоть даже и на срваке выполняется и явл. только клиентом SQL-Server'a - все равно должен быть чем тоньше, тем лучше (про "конечных" клиентов я вообще молчу).

//imho
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008190
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Павел
А я специально фразу "VB and C++ могут быть клиентами ну конечно как бы в переносном смысле" составил таким образом, что бы не писать, что "Сами языки даже в переносном смысле не клиенты. А вот программы...". Я конечно слегка в курсе client/server technologies.
Вот что. Значит у компонента ADODataSet есть свойство adResyncAutoIncrement. Если его установить, то куда-то этот ID возврашается, а значит его от туда можно прочитать. Это самый короткий путь. Никаких процедур не надо.
Мы конечно на 'insert into Table1(Text) values (''' + Str + ''') select scope_identity() as ''[Вот последний ID]''' и остановились. Это просто и трафик не грузит почти. Но я хочу быть круче.
Хотя есть подозрения о том что это свойство дает возможность самому ADODataSet функционировать нормально, а юзеру(программисту) это ID не доступно.
Если не затруднит, почитайте http://www.delphikingdom.com/helloworld/ado02.htm раздел "Update Resync".
2 Cube
Теперь Вы поняли, что я как раз к "тонкости" и стремлюсь?
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008193
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так и не понял, для чего Вам это все нужно. Одно дело пасти Grid в форме, другое дело использовать этот id для построения бизнесс - логики. В первом случае adResyncAutoIncrement заставляет ADO после операции вставки запросить у сервера @@Identity. Так что в случае вставки записей в таблицу с триггером на вставку записей в другую таблицу с полем счетчик сервер вернет значение для второй таблицы, а не для первой. Во втором случае, Slava, я мог бы Вам пасписать, почему процедура на сервере будет быстрее и эффективнее работать, но с уважениям относяь к Вашему стремлению к крутизне и тонкости этого делать не буду. Просто по моему пока это бесполезно. За ссылочку спасибо. Только если Вы внимательно читали мои ответы, то наверняка видели там ссылочку на ветку, где все это уже подробно обсуждалось. В том числе я приводил и ссылку на эту статью. Так и будем друг друга туда посылать?
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008197
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если возвращается @@IDENTITY, то спопсоб SELECT SCOPE_IDENTITY AS 'Вот твой ID', подходит больше.
Мне конечно не надо про процедуры писать. Как бы читали про них.
Тут речь о логике вставки во всей проге(100 таблиц). Ну не буду же я для каждой таблицы свою процедуру делать. Да и exec не поможет.
Большое спасибо за обсуждение!
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008198
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
// опять же ИМХО
Отталкиваясь от собственного опыта могу сказать сл.:
1. Редактировать записи в гриде - последнее дело. Гораздо более удобным (для всех) оказывается такой путь: грид служит только для навигации по сету. При перемещении грид-курсора, который выделяет всю записть, а не отдельные поля, в соответствующих edit-control'ах, расположенных, скажем, под гридом, отображаются значения полей. Юзер может
а) Добавить новую запись, введя новые значения в контролы. При этом вызывается соотв. SP с параметрами типа SP_AddNewHrenovObject , которая вернет новый PK.
б) Изменить текущую запись, откорректировав содерж. контролов и нажав кнопку [Изменить]. Вызовется SP_ChangeHrenovObject, которой в кач. парам. передается ID тек. записи.
в) Ну и удалить тек. зап. соотв. выз. SP_NafigHrenovObject + 1000 предуп. типа "Вы действ... "

Так что бд-клиент и не знает ни о каких идентити и т.п. Все, на что он способен, это вызвать SP.
Наилучшим средством для реализ. такого подхода явл. комбинация браузер + сервлет + бд-сервер

2. Эсли кн-нить опровергнет вышеизложенное (частично или полностью) буду очень признателен.
Но не так:
HrenovSet = OpenRecordset("SELECT * FROM tblHrenovaTablitsa", DB_DYNASET | DB_NEVERMIND | DB_HOVAISAHTOMOZJET)
HrenovSet.Fields(1).Value = "It wroks!!!"
и т.п.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008199
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Cube
У меня в БД 100 таблиц. Для каждой процедуру? Не проще ли 'insert into Table1(Text) values (''' + Str + ''') select scope_identity() as ''[Вот последний ID]'''?
И еще. Ценность процедуры конечно велика, но надо точно разобраться где. Если мы хотим вставить запись в таблицу, то вобщем все равно, отправим ли мы с клиента exec Proc или insert... Согласитесь, что трафик в этих случаях почти одинаков. Вот если бы мы хотели выбрать откуда-то записи, посмотреть что в них и на основе этого сделать куда-то insert, то вот тут то и надо SP делать, что бы результирующий набор селекта по сети не гонялся от сервера к лиенту.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008200
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>У меня в БД 100 таблиц. Для каждой процедуру?

Слава, ну ты же не поленился создать 100 таблиц...

>И еще. Ценность процедуры конечно велика, но надо точно разобраться где. Если мы хотим вставить запись в таблицу, то вобщем все равно, отправим ли мы с клиента exec Proc или insert... Согласитесь, что трафик в этих случаях почти одинаков.

Дело здесь не столько в трафике, сколько в логике, а точнее в стратегии. Клиент НЕ ЗНАЕТ о том, что есть какие-то таблицы, инсерты и т.п. Он (клиент) оперирует с объектами, которые ему необходимо хранить в некотором хранилище. Чем меньше он знает о внутренней организации оного, тем лучше. И пусть в SP один единственный инсерт - это не важно. Совокупность хранимых процедур это интерфейс взаимодействия бд-клиента и бд-сервера (в смысле бд-серверной части приложения). Бд-клиент не должен лезть в кишки бд-сервера в обход установленного интерфейса.
Получается такая структура:

Кон. клиент <-- тут все ясно --> бд-клиет <-- механизм SP --> бд-сервер <-- SQL etc... --> конкретный бд-серв. (в частности MS SQL Server).
либо:
бд-клиет он же кон. клиент <-- механизм SP --> бд-сервер <-- SQL etc... --> конкретный бд-серв.

при такой оганизации изменение логики одного звена не повлияет на оснальные звенья
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008202
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 cube:
>Редактировать записи в гриде - последнее дело.

Ну хорошо, предположим что в гриде 100000 записей. Ну при мзменении/удалении все понятно, а вот при вставке действительно придется перечитывать весь набор, да еще возможно и позиционироваться на нужную запись. Т.е. тонкий клиент с толстыми потребноcтями. Вряд ли это оптимальное решение. Про возражение типа "а на хрена тащить столько записей на клиента" сразу оговорюсь - в моем случае надо. Только в ADODB.Recordset уже заложена оптимизация подобных действий. Как было справедливо отмечено это динамические свойства Resync Command и Update Resync.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008203
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 cube:
>при такой оганизации изменение логики одного звена не повлияет на остальные звенья

Вот Вам конкретный пример: одним клиентам разрешается изменение конкретного поля таблицы, другим не разрешается. SP выполнится в любом случае. Или предложите в sp проверять права пользователя? Так ведь сервер может сам сделать это автоматом! Так что еще как повлияет! Тем более это не вопрос логики приложения. Не будьте столь категоричны, это всего лишь вариант механизма взаимодействия клиента с сервером. Хотя в таком варианте есть плюсы (можно при отсутсвии прав ругнутся несколько пристойнее чем это сделает сервер). И безусловно во многих случаях предложенный Вами способ вполне применим. Но далеко не во всех.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008204
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Павел:
извините за некоторую категоричность, я не хотел, чтобы это все так прозвучало...
<ИМХО>
С пользователями отличный пример. Интересный. Я воплощал так:
Основная прога работает на серваке, по сети конечным юзерам гоняются только интерфейсы.
Система безопасности SQL Server не используется (все конекты от имени sa).
Есть спец. база пользователей, где хран. пользователи, группы, экшины и разрешения.
Механизм:
Юзер сервлету: я такой-то юзер, хочу добавить объект
Сервлет - бд-серверу : usr_ID хочет выполнить ActionName
бд-сервер - сревлету : permit = 0
сервлет - юзеру : низьзья
или
бд-сервер - сревлету : permit = 1
сервлет - бд-серверу : exec SP_ActionName
бд-сервер - сревлету : result = 1
сервлет - юзеру : все ништяк

Получается, что каждый общается на своем языке. В итого Юзер не будет падать в обморок от наворотистых ругательств, всплывающих из недр SQL Server'а, и, следовательно не будет вам звонить с претензиями типа "Я тут все правильно делаю а оно глючит и ваще..."

Кстати, настройка разрешений и юзеров - это те же экшины, которые разрешены админу данного приложения.

А курсор - хоть серверный, хоть клиентский - он и в Африке курсор. И лучше чем в BOL о нем врядле скажешь
</ИМХО>
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008210
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а как обстоит дело с другими глобальными переменными (@@error, @@fetch_status ecs)? Неужели реализация в MSSQL такова что они разделяются всеми соединениями?

P.S. Меня больше интересует MSSQL7. Кстати, насколько я понимаю, SCOPE_IDENTITY() отсутствует в MSSQL7.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008236
Peter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 maximf:
>Интересно, а как обстоит дело с другими глобальными переменными (@@error, @@fetch_status >ecs)? Неужели реализация в MSSQL такова что они разделяются всеми соединениями?
Да, конечно. В противном случае их ценность была бы сомнительна.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008237
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Peter & maximf

По моему, слово "разделяются" вы понимаете в противоположных смыслах

В общем (@@error, @@fetch_status) действуют внутри своего коннекта, сами посудите зачем мне знать ошибки соседних подключений?
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008268
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а @@identity ?
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008269
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Явного указания в BOL я как то не нашел, но все переменные(функции) типа @@ действуют в пределах коннекта, иначе они просто бессмыслены.
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008276
cube
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady:
Вот и я не нашел... Как и не нашел ответ на такой вопрос: нужно ли осуществлять блокировки внутри хранимых процедур?
...
Рейтинг: 0 / 0
Опять вопрос по IDENTITY
    #32008280
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цитата из BOL:
@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the
CURRENT SESSION.
----------------

However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опять вопрос по IDENTITY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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