[mssql] Reserwacja wartosci klucza glownego
=?ISO-8859-2?Q?Adam_K=B3obukowski?= - 26-11-2005 22:28
[mssql] Reserwacja wartosci klucza glownego
Witam
Jak zarezerwowac wartosc klucza glownego dla nowego (ale jescze nie istniejacego) wiersza? (przy zalozeniu uzywam IDENTITY). W .NET potrafi takie cos Dataset, tzn. mozna poznac wartosc klucz glownego przed zapisaniem wiersza w bazie danych... ale jak to zrobic z SQLa (albo programistycznie w .NET bez uzycia datasetu)?
-- Semper Fidelis
Adam Klobukowski atari@gabo.pl
Karlo - 26-11-2005 22:28
Adam Kłobukowski wrote: > Witam > > Jak zarezerwowac wartosc klucza glownego dla nowego (ale jescze nie > istniejacego) wiersza? (przy zalozeniu uzywam IDENTITY). W .NET potrafi > takie cos Dataset, tzn. mozna poznac wartosc klucz glownego przed > zapisaniem wiersza w bazie danych... ale jak to zrobic z SQLa (albo > programistycznie w .NET bez uzycia datasetu)? > Polecam SQL Server Books Online pod hasłem SCOPE_IDENTITY
Pozdrowienia, Karlo
=?ISO-8859-2?Q?Adam_K=B3obukowski?= - 26-11-2005 22:28
Karlo napisał(a): > Adam Kłobukowski wrote: > >> Witam >> >> Jak zarezerwowac wartosc klucza glownego dla nowego (ale jescze nie >> istniejacego) wiersza? (przy zalozeniu uzywam IDENTITY). W .NET >> potrafi takie cos Dataset, tzn. mozna poznac wartosc klucz glownego >> przed zapisaniem wiersza w bazie danych... ale jak to zrobic z SQLa >> (albo programistycznie w .NET bez uzycia datasetu)? >> > Polecam SQL Server Books Online pod hasłem SCOPE_IDENTITY
No tak, ale oile rozumiem to dobrze, SCOPE_IDENTITY zwraca mi wartosc identity ostation insertowanego elementu - a ja chce zarezerwowac wartosc klucza przed zainsertowaniem wiersza.
-- Semper Fidelis
Adam Klobukowki atari@gabo.pl
=?iso-8859-2?Q?Pawe=B3_Filipiak?= - 26-11-2005 22:28
Użytkownik "Adam Kłobukowski" <atari@gabo.pl> napisał w wiadomości news:dm425n$f9r$1@news.dialog.net.pl... > Witam > > Jak zarezerwowac wartosc klucza glownego dla nowego (ale jescze nie nie da się - możesz co najwyżej ustwić wartośc początkową identity i krok z jakim jest zwiększane (czyli dałoby się na przykład wydusic, żeby uzywane były wartosci 1000, 1100,1200,1300,... a zakres 1101...1199 i kolejne bedzie nie ruszony)
> istniejacego) wiersza? (przy zalozeniu uzywam IDENTITY). W .NET potrafi > takie cos Dataset, tzn. mozna poznac wartosc klucz glownego przed To nie tak. Kolumna o ustawionym autoincrement "przewiduje" wartośc klucza na podstawie wartości aktualnie zaczytanych z bazy. Po zainsertowaniu wiersza rzeczywista, nadana wartość identity z bazy jest nadpisywana do wiersza w DataTable i do wierszy "potomnych", połączonych relacjami. Może się zdarzyć, że wartości sie pokryją, ale to przypadek - zrób taki eksperyment, że z tabeli zwierającej kilka rekordów (i kolumnę identity oczywiscie) usuń z poziomu bazy rekord o najwyższym id. Zaczytaj później to do DataTable, wstaw nowy wiersz do DataTable (pojawi się id o 1 wieksze o maksymalnego, o ile domyslne wartosci AutoincrementSeed i AutoIncrementStep pozostały bez zmian) a następnie zsynchronizuj dane do bazy. Zostanie nadane nowe id (różne od "przewidywanego") i jeżeli zwracasz wartosci zmodyfikowane przez bazę (właściwość UpdatedRowsource DataAdaptera i odpowiednia konstrukcja sql) to nowe id pojawi się również w DataTable
-- pozdrawiam, Paweł Filipiak, gg 2791867
Karlo - 26-11-2005 22:28
Adam Kłobukowski wrote:
> > > No tak, ale oile rozumiem to dobrze, SCOPE_IDENTITY zwraca mi wartosc > identity ostation insertowanego elementu - a ja chce zarezerwowac > wartosc klucza przed zainsertowaniem wiersza. > Hmmm... W takim razie polecam rowniez haslo IDENTITY_INSERT :) A tak powaznie - jezeli bedziesz mial dalej problemy to daj znac na priva.
Pozdrowka, Karlo
Vez do Han - 26-11-2005 22:28
Użytkownik "Adam Kłobukowski" <atari@gabo.pl> napisał w wiadomości news:dm48qv$lth$1@news.dialog.net.pl... [...] > No tak, ale oile rozumiem to dobrze, SCOPE_IDENTITY zwraca mi wartosc > identity ostation insertowanego elementu - a ja chce zarezerwowac > wartosc klucza przed zainsertowaniem wiersza.
Albo znasz wartość klucza i nie ma co rezerwować (co najwyżej sprawdzić czy już go ma) albo nadajesz go automatycznie w chwili wpisania i wtedy też nie ma co rezerwować. Po to jest identity aby się samo nadawało. Szukasz obejścia automatu a może wcale go tam nie musi być?
Karlo - 26-11-2005 22:29
Paweł Filipiak wrote: > Użytkownik "Adam Kłobukowski" <atari@gabo.pl> napisał w wiadomości > news:dm425n$f9r$1@news.dialog.net.pl... > >> Witam >> >> Jak zarezerwowac wartosc klucza glownego dla nowego (ale jescze nie > > nie da się - możesz co najwyżej ustwić wartośc początkową identity i > krok z jakim jest zwiększane (czyli dałoby się na przykład wydusic, żeby > uzywane były wartosci 1000, 1100,1200,1300,... a zakres 1101...1199 i > kolejne bedzie nie ruszony) >
Otoz da sie. Ponizej przedstawiam rozwiazanie: Zalozenia: Tabela tblProdukty zawierajaca dwie kolumny: IDProduktu oraz NazwaProduktu. Kolumna IDProduktu to powiedzmy smallint z zalozonym IDENTITY. Kolumna NazwaProduktu jest powiedzmy typu varchar(50). OK. Teraz bierzemy sie do pracy... :)
Wpisujemy jakies dwie dowolne wartosci (z reki, z QA, albo jakkolwiek inaczej). W tym momencie ostatnia wartosc w kolumnie IDProduktu powinna wynosic 2. Nastepnie odpalamy takie cos: SET IDENTITY_INSERT tblProdukty ON GO INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) VALUES (4,'test') GO SET IDENTITY_INSERT tblProdukty ON GO Jaki jest efekt? Wstawiony rekord ma w kolumnie IDProduktu wartosc 4, czyli mamy "zarezerwowana" 3.
Teraz mozemy wstawic rekord z "zarezerwowanym" IDProduktu: SET IDENTITY_INSERT tblProdukty ON GO INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) VALUES (3,'zarezerwowany') GO SET IDENTITY_INSERT tblProdukty ON GO
Pozdrowienia, Karlo
Vez do Han - 26-11-2005 22:29
Użytkownik "Karlo" <karlo47@wp.pl> napisał w wiadomości news:dm4p7m$lr$1@atlantis.news.tpi.pl... [...] > Otoz da sie.
Tak da się.
> Ponizej przedstawiam rozwiazanie: > Zalozenia: > Tabela tblProdukty zawierajaca dwie kolumny: IDProduktu oraz > NazwaProduktu. Kolumna IDProduktu to powiedzmy smallint z zalozonym > IDENTITY. Kolumna NazwaProduktu jest powiedzmy typu varchar(50). > OK. Teraz bierzemy sie do pracy... :) > > Wpisujemy jakies dwie dowolne wartosci (z reki, z QA, albo jakkolwiek > inaczej). W tym momencie ostatnia wartosc w kolumnie IDProduktu powinna > wynosic 2. Nastepnie odpalamy takie cos:
OK
> SET IDENTITY_INSERT tblProdukty ON > GO > INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) > VALUES (4,'test') > GO
Tu już nie OK. Te 4 to ktoś już mógł wpisać. Zakładasz niejawnie, że masz tabele na wyłączność a nie masz.
> SET IDENTITY_INSERT tblProdukty ON > GO > Jaki jest efekt? Wstawiony rekord ma w kolumnie IDProduktu wartosc 4, > czyli mamy "zarezerwowana" 3.
Nie wiemy nie sprawdziliśmy czy insert się udał. Mało tego 3 też już może być zajęte.
> > Teraz mozemy wstawic rekord z "zarezerwowanym" IDProduktu: > SET IDENTITY_INSERT tblProdukty ON > GO > INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) > VALUES (3,'zarezerwowany') > GO > SET IDENTITY_INSERT tblProdukty ON > GO >
Jak ktoś równolegle, ale trochę szybciej, zrobił to samo to z ID 3 mamy jego rekord a nie nasz.
Problem jest, źle postawiony.
Karlo - 26-11-2005 22:29
Vez do Han wrote: [ciach] > > >>SET IDENTITY_INSERT tblProdukty ON >>GO >>INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) >>VALUES (4,'test') >>GO > > > Tu już nie OK. Te 4 to ktoś już mógł wpisać. Zakładasz niejawnie, że masz > tabele na wyłączność a nie masz. >
Masz racje. Moze w takim razie sprobowac otworzyc taka tabele na wylacznosc? Chociaz nie wiem, czy gra jest warta swieczki.
> >>SET IDENTITY_INSERT tblProdukty ON >>GO >>Jaki jest efekt? Wstawiony rekord ma w kolumnie IDProduktu wartosc 4, >>czyli mamy "zarezerwowana" 3. > > > Nie wiemy nie sprawdziliśmy czy insert się udał. Mało tego 3 też już może > być zajęte. >
Ponownie masz racje.
> > >>Teraz mozemy wstawic rekord z "zarezerwowanym" IDProduktu: >>SET IDENTITY_INSERT tblProdukty ON >>GO >>INSERT INTO tblProdukty (IDProduktu, NazwaProduktu) >>VALUES (3,'zarezerwowany') >>GO >>SET IDENTITY_INSERT tblProdukty ON >>GO >> > > > Jak ktoś równolegle, ale trochę szybciej, zrobił to samo to z ID 3 mamy jego > rekord a nie nasz. > > Problem jest, źle postawiony. >
Tez tak mysle. Wydaje sie, ze najlepszym rozwiazaniem bedzie pozbycie sie wlasnosci IDENTITY i oprogramowanie tego z poziomu aplikacji klienckiej. Jak przyjda mi do glowy jakies inne pomysly, to dam znac. ;)
Pozdrowka, Karlo
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
[MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
MSSQL Express czy Oracle Express
MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[MSSQL 2000] =?ISO-8859-2?Q?wywo=B3anie_procesu_z_poziomu_?==?ISO-8859-2?Q?job=27a?=
[MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?=
Pobierananie danych z innej bazy danych w MSSQL
Migracja MSSQL 2005 CTP na 2005 Express
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|