ďťż
 
[mssql] Reserwacja wartosci klucza glownego ďťż
 
[mssql] Reserwacja wartosci klucza glownego
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kfia-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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com