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

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

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

Slava, извини, я посчитал что это ты автор ветки http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1523 В ней вроде все обговорили на эту тему. Посмотри, может предложенные решения тебя устроят. А те компоненты, которые ты перечислил могут возвращать набор записей (Recordset), а могут и не возвращать. В последнем случае можно получить значение счетчика через выходной параметр сохраненной процедуры или через код ее завершения (если тебе нужно, к примеру, загнать это значение в переменную). Вот я попросил тебя уточнить, что именно ты собираешся делать с этим значением.
...
Рейтинг: 0 / 0
22.06.2001, 10:16
    #32008120
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
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
22.06.2001, 10:43
    #32008127
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
>Через выходной параметр процедуры и код ее завершения не хочу, потому как неохото лишнюю процедуру писать
Это Вы, батенька, напрасно... Количество "клиентских" запросов нужно вседа минимизировать и использовать SP где только можно.
...
Рейтинг: 0 / 0
22.06.2001, 10:47
    #32008128
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
зы: особенно, если "хотите быть круче"
...
Рейтинг: 0 / 0
22.06.2001, 11:01
    #32008131
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
>VB and C++ могут быть клиентами ну конечно как бы в переносном смысле.

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

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

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

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

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

//imho
...
Рейтинг: 0 / 0
23.06.2001, 06:28
    #32008190
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
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
23.06.2001, 08:23
    #32008193
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
Я так и не понял, для чего Вам это все нужно. Одно дело пасти Grid в форме, другое дело использовать этот id для построения бизнесс - логики. В первом случае adResyncAutoIncrement заставляет ADO после операции вставки запросить у сервера @@Identity. Так что в случае вставки записей в таблицу с триггером на вставку записей в другую таблицу с полем счетчик сервер вернет значение для второй таблицы, а не для первой. Во втором случае, Slava, я мог бы Вам пасписать, почему процедура на сервере будет быстрее и эффективнее работать, но с уважениям относяь к Вашему стремлению к крутизне и тонкости этого делать не буду. Просто по моему пока это бесполезно. За ссылочку спасибо. Только если Вы внимательно читали мои ответы, то наверняка видели там ссылочку на ветку, где все это уже подробно обсуждалось. В том числе я приводил и ссылку на эту статью. Так и будем друг друга туда посылать?
...
Рейтинг: 0 / 0
23.06.2001, 09:10
    #32008197
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
Если возвращается @@IDENTITY, то спопсоб SELECT SCOPE_IDENTITY AS 'Вот твой ID', подходит больше.
Мне конечно не надо про процедуры писать. Как бы читали про них.
Тут речь о логике вставки во всей проге(100 таблиц). Ну не буду же я для каждой таблицы свою процедуру делать. Да и exec не поможет.
Большое спасибо за обсуждение!
...
Рейтинг: 0 / 0
23.06.2001, 09:16
    #32008198
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
// опять же ИМХО
Отталкиваясь от собственного опыта могу сказать сл.:
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
23.06.2001, 09:45
    #32008199
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
2 Cube
У меня в БД 100 таблиц. Для каждой процедуру? Не проще ли 'insert into Table1(Text) values (''' + Str + ''') select scope_identity() as ''[Вот последний ID]'''?
И еще. Ценность процедуры конечно велика, но надо точно разобраться где. Если мы хотим вставить запись в таблицу, то вобщем все равно, отправим ли мы с клиента exec Proc или insert... Согласитесь, что трафик в этих случаях почти одинаков. Вот если бы мы хотели выбрать откуда-то записи, посмотреть что в них и на основе этого сделать куда-то insert, то вот тут то и надо SP делать, что бы результирующий набор селекта по сети не гонялся от сервера к лиенту.
...
Рейтинг: 0 / 0
23.06.2001, 10:37
    #32008200
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
>У меня в БД 100 таблиц. Для каждой процедуру?

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

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

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

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

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

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

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

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

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

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

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

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

В общем (@@error, @@fetch_status) действуют внутри своего коннекта, сами посудите зачем мне знать ошибки соседних подключений?
...
Рейтинг: 0 / 0
25.06.2001, 12:34
    #32008268
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
а @@identity ?
...
Рейтинг: 0 / 0
25.06.2001, 12:42
    #32008269
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
Явного указания в BOL я как то не нашел, но все переменные(функции) типа @@ действуют в пределах коннекта, иначе они просто бессмыслены.
...
Рейтинг: 0 / 0
25.06.2001, 13:40
    #32008276
cube
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
2 Genady:
Вот и я не нашел... Как и не нашел ответ на такой вопрос: нужно ли осуществлять блокировки внутри хранимых процедур?
...
Рейтинг: 0 / 0
25.06.2001, 13:55
    #32008280
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять вопрос по IDENTITY
Цитата из 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опять вопрос по IDENTITY / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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