Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа уникальными значениями [D7, IB6.x, MSSQL]


Страницы:   1 2 3 4

den_777 ©   (2004-05-24 09:46:00) 

Пока мне приходилось работать только с INFORMIX и IB,FB. Поэтому приведу пример на этих базах.
Надо чтобы была возможность автоматической и ручной вставки значения в поле которое является PRIMARY KEY, т.е. для таблицы с полями ID и CNAME проходили оба SQL insert into tbl1(id,cname) values(0,"myname") и insert into tbl1(cname) values("myname")
Соответственно в INFORMIX я просто задаю этому полю тип SERIAL и все, больше ничего делать не надо. В первом случае INFORMIX просто проверяет не противоречит ли вставляемое мной значение уникальности и если нет то вставляет его во втором случае сам генерит следующее значение.
В IB,FB это решается с помощью генератора и триггера IF NEW.ID IS NULL THEN NEW.ID=GEN_ID(MY_GEN,1).
Вопрос как таких же действий добиться от MSSQL. И вопрос в догонку, если в других базах какой-либо функционал был заложен в триггер перед вставкой, то как этот же функционал реализовать в MSSQL.


ega23   (2004-05-24 16:51:00) [21]

в MSSQL нет некоторых основопологающих вещей.
А что есть "основопологающая вещь"?


Delirium   (2004-05-24 16:43:00) [22]

"Что же я там должен увидеть.Это же подмена вставки, а не полноценный триггер BEFORE INSERT" - правильно, это более мощная конструкция, нежели "BEFORE INSERT", иначе говоря "BEFORE INSERT" - частный случай "INSTEAD OF INSERT". Думаю, вопрос решён.

P.S. "в MSSQL нет некоторых основопологающих вещей" - это ваше частное и в общем случе безграмотное мнение. Прежде чем так высказываться, дайте определение "основопологающих вещей" не забыв добавить IMHO.


Sandman25+1   (2004-05-24 16:35:00) [23]

[38] den_777   (24.05.04 16:15)
просто мне кажется что в MSSQL нет некоторых основопологающих вещей.

Возможно. Человек ко всему привыкает и почти всегда есть несколько способов добиться желаемого. Если бы Вы наоборот переходили с MS SQL или Orcale на Informix, Вы бы точно так же могли упрекнуть последний в отсутствии некоторых механизмов.


den_777   (2004-05-24 16:15:00) [24]


> Romkin ©   (24.05.04 15:28) [35]

Наверное имелось ввиду вот это.
create procedure CLIENT_ID
 @TableName varchar(30),
 @ID int output
as
 update Seeds
   set ID = ID + 1,
       @ID = ID + LowOffset
   where TableName = @TableName
go

предположим ситуацию
в ID записано значение 5
Два пользователя вставляют данные в одну и туже таблицу, но у обоих пользователей большие транзакции с вставкой данных в несколько таблиц.Первая транзакция получает значение 6, вторая 7.
Первая транзакция после неудачной вставки в какие то другие таблицы откатывается. Что буде с ID. Мне кажатся что 5.В случае блокировки записи в seeds до окочания первой транзакции, вторая может вылетить по timeout или просто здорово затормозить работу.
Может я что-то не так понимаю, объясните пожалуйста.
В том то и дело что в FireBird generator стоит вне транзакции и никак от нее не зависит, а с помощью таблиц такого не получится.


> А то я могу сказать, что Firebird спокойно делает все информиксы
> и ораклы по соотношению цена/производительность :))

И я тоге же мнения


> INSTEAD OF + F1

Что же я там должен увидеть.Это же подмена вставки, а не полноценный триггер BEFORE INSERT


> Sandman25+1   (24.05.04 15:30) [37]
> Спасибо за интересный разговор.

И ВАМ спасибо. Я ни в коем случае не идеализирую INFORMIX(или какую-либо другую СУБД), просто мне кажется что в MSSQL нет некоторых основопологающих вещей.


Sandman25+1   (2004-05-24 15:30:00) [25]

[34] den_777   (24.05.04 15:20)

И все-таки я настаиваю, что мы смотрим с разных точек зрения. Если СУБД суперскоростная, но не поддерживает некоторых возможностей, то такая, как бы ее назвать... MySQL без вложенных SELECT или Paradox без триггеров... меня совсем не устраивает.
Спасибо за интересный разговор.


Delirium   (2004-05-24 15:28:00) [26]

> den_777  (24.05.04 09:46)  
INSTEAD OF + F1
P.S. В MSSQL легко делается, то, что вы описали, читайте хелп.


Romkin   (2004-05-24 15:28:00) [27]

Ну хватит уже меряться :))
А то я могу сказать, что Firebird спокойно делает все информиксы и ораклы по соотношению цена/производительность :))
По сути, обычно при такой нужде именно таблицу под все ID и делают в MSSQL, http://rsdn.ru/article/db/midas_migration.xml


den_777   (2004-05-24 15:20:00) [28]

Для Вас, как для администратора
Да не был я никогда чисто администратором, всегда совмещал обязанности программиста и разработчика БД. Ну иногда по совместительству поддерживал работу этих БД. А как же иначе разрабатывать программы не учитывая всех возможностей по администрированию и настройке СУБД.


Sandman25+1   (2004-05-24 15:04:00) [29]

[31] den_777   (24.05.04 14:43)

Ну тогда о чем говорить? Для Вас, как для администратора, более важным является не совсем то (точнее, совсем не то :-) , что является важным для меня, как для разработчика ХП и прочих атрибутов серверной части ПО.


den_777   (2004-05-24 14:47:00) [30]


> создать отдельную таблицу под все ID

Вариант сам собой напрашивается, но как то слишком некрасиво. Теряем информацию(естественно без дополнительной журнализации) по последовательности ввода записей в определенную таблицу.


den_777   (2004-05-24 14:43:00) [31]


> что до введения генераторов (sequence) и select * from table(select
> ...) у

В том то и дело что для меня это не является преимуществами, я говорил про надежность,скорость,тонкие настройки работы на многопроцессорных машинах,настройки работы при большом количестве пользователей,исчерпывающий мониторинг и статистику(пусть и в текстовом режиме), настройки для OLTP и DSS и т.п. И еще я никогда не работал c INFOMRIXом на машинах с процессорами INTEL, возможно там у INFORMIXа нет тех преимуществ, которые у него есть на SPARC+SOLARIS. А INFORMIX под WINDOWS  - это вообще отдельная тема.


paul_k   (2004-05-24 14:40:00) [32]


> den_777   (24.05.04 14:34) [28]

F1 - CREATE FUNCTION
создать отдельную таблицу под все ID


Johnmen   (2004-05-24 14:35:00) [33]

>...попросил найти аналогию в MSSQL.

Ещё раз. ПРЯМАЯ аналогия может быть либо неосуществима, либо реализовываться идеологически некорректно.
Поэтому чётко скажи, что надо-то ? Не приводя примеров/аналогий из др.серверов...


den_777   (2004-05-24 14:34:00) [34]


> paul_k ©   (24.05.04 14:24) [26]

INFORMIX привел только ради примера существования такой возможности в ранее известных мне СУБД. Тема закрыта.

А вот по поводу функции по DEFAULT есть одно неприятное ограничение: имя таблицы указано прямо в теле функции соответственно придется писать подобные функции для каждой таблицы. Может быть есть способ узнать в теле функции кто ее вызвал.


Sandman25+1   (2004-05-24 14:27:00) [35]

[24] den_777   (24.05.04 14:18)

Я проработал с Informix под SCO Unixware 7.1 около 6 лет :) но тем не менее я совершенно спокойно признаю, что до введения генераторов (sequence) и select * from table(select ...) у MS SQL было несколько важных преимуществ.


paul_k   (2004-05-24 14:24:00) [36]


> Интересно, что-же там на 519стр.

Глава 22  "Создание и использование тригерров


> Раз уж программисты написавшие INFORMIX (по моему мнению
> СУБД INFORMIX на порядок лучше чем MSSQL и по надежности,
> и по скорости работы, и по возможности настроек) сделали
> тип SERIAL  с функционалом, который я уже описывал, значит
> это кому-нибудь нужно.

1. Если мне не изменяет память уши MsSql растут из Sybase -  dполне достойной корпоративной СУБД, а что наворотили на это под убравлением Билли Гейца - это второй вопрос.
2. А функционал - есть он, только реализован по другому

CREATE FUNCTION dbo.t_test_New_Id()
RETURNS numeric
AS
BEGIN

       DECLARE @id  numeric
SELECT @id = (select isnull( max(id),1)+1 from t_test)
-- или как ты там желаешь ID заполнить по умолчанию
RETURN @id
END
GO

CREATE TABLE dbo.t_test
(
id numeric(18, 0) NOT NULL,
field_1 varchar(50) NULL
)  ON [PRIMARY]
GO
ALTER TABLE dbo.t_test ADD CONSTRAINT
DF_t_test_id DEFAULT dbo.t_test_New_Id() FOR id
GO


den_777   (2004-05-24 14:22:00) [37]


> Так мы про что здесь говорим ? Про INFORMIX или MSSQL ?
> Ты уж определись...:)


Я и определился. В самом первом посте привел пример про INFORMIX,IB,FB и попросил найти аналогию в MSSQL. Вот и все.


den_777   (2004-05-24 14:18:00) [38]


> Sandman25+1   (24.05.04 13:59) [22]

Прости, если задел тебя за живое. Для меня всякие фичи(навороты,упрощения для разработчика и т.п.) не являются объектами при сравнении двух СУБД, а по перечисленным мной параметрам INFORMIX и на версии 7.2 даст большую фору MSSQL. Может я не участвовал в разработках баз, которые реализовывали бы все преимущества MSSQL по сравнению с другими СУБД, но вот наоборот случалось работать. Так что это мое незыблемое мнение в котором я и хотел бы может быть разубежден, но только конкретными аргументами в пользу MSSQL. Аргументов в пользу INFORMIX для людей проработавших на MSSQL я к сожалению привести не смогу, так как все слишком специфично, чтобы объяснить это на пальцах, а аналогий в MSSQL нет. Если же ты проработал на INFORMIX (под SOLARIS разумеется) хотя бы лет 5 и поподдерживал бы базы объемом в сотни ГГб и с таблицами в сотни милионов записей, то мне странно твое мнение.

А если ты сравнил по ТТХ(описанию возможностей), не  имея опыта работы, то твое мнение не имеет никакой цены.(надеюсь это не так).


Johnmen   (2004-05-24 14:14:00) [39]

>Раз уж программисты написавшие INFORMIX (...

Так мы про что здесь говорим ? Про INFORMIX или MSSQL ?
Ты уж определись...:)
И имей в виду, что приёмы, хорошо и корректно "ложащиеся" под одним SQL сервером, таковыми под другим могут и не быть !


Sandman25+1   (2004-05-24 13:59:00) [40]

[21] den_777   (24.05.04 13:45)

Не надо так про MS SQL. Многие возможности MS SQL появились только в последних версиях Informix, точнее, в 9.4


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо