wyzwalacz w MSSQL , new_id()
Sowiecki Agent - 01-04-2007 00:03
wyzwalacz w MSSQL , new_id()
Witam!
Otoz mam <zapewne banalny!> problem. Posiadam X tabel w bazie, i wszystkie jako pola ID maja ustawione pola typu uniqueidentifier. W niektorych mam potrzebe manulanie utworzyc pole ID - np przy dokumentach typu masterdetail, jednak w zdecydowanej wiekszosci ten numer powinien wpisac sie automatycznie tak jak w przypadku pola int z opcja identity. No i teraz nie wiem jak to zrobic, moge sie jedynie domyslac ze powinienem stworzyc wyzwalacz instead of insert (domyslam sie ze to jest cos na wzor before insert) . I mojepytanie tutaj brzmi w jaki sposob w wyzwalaczu wpisac nowa wartosc dla danego pola ? W Firebird pisalem po prostu NEW.pole = cos tam, tutaj mam potrzebe napisania
IF (NEW.id_pole IS NULL) THEN NEW.id_pole = new_id();
oczywiscie takiej skladni nie przyjmuje. Zalozmy ze tabela jest o nazwie tabela, pole o nazwie pole_id,
prosze o pomoc, googlam i cholery dostaje bo nic konretnego nie moge znalezc w necie.
Pozdrawiam P.
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
Sylwester Lewandowski - 01-04-2007 00:03
Sowiecki Agent napisał(a): > Witam! > > Otoz mam <zapewne banalny!> problem. > Posiadam X tabel w bazie, i wszystkie jako pola ID maja ustawione pola > typu uniqueidentifier. W niektorych mam potrzebe manulanie utworzyc pole > ID - np przy dokumentach typu masterdetail, jednak w zdecydowanej > wiekszosci ten numer powinien wpisac sie automatycznie tak jak w > przypadku pola int z opcja identity. > No i teraz nie wiem jak to zrobic, moge sie jedynie domyslac ze > powinienem stworzyc wyzwalacz instead of insert (domyslam sie ze to jest > cos na wzor before insert) . I mojepytanie tutaj brzmi w jaki sposob w > wyzwalaczu wpisac nowa wartosc dla danego pola ? > W Firebird pisalem po prostu NEW.pole = cos tam, > tutaj mam potrzebe napisania > > > IF (NEW.id_pole IS NULL) THEN > NEW.id_pole = new_id(); > > > > oczywiscie takiej skladni nie przyjmuje. > Zalozmy ze tabela jest o nazwie tabela, pole o nazwie pole_id, > > prosze o pomoc, googlam i cholery dostaje bo nic konretnego nie moge > znalezc w necie. > > Pozdrawiam > P. > >
Hej,
Czy musi to isc przez wyzwalacz ? Moze wystarczy dodac default dla kolumny ID o typie UNIQUEIDENTIFIER ? Przyklad tabeli :
IF OBJECT_ID('dbo.Tabela') IS NOT NULL DROP TABLE dbo.Tabela; GO
CREATE TABLE dbo.Tabela ( id UNIQUEIDENTIFIER NOT NULL CONSTRAINT PK_Tabela PRIMARY KEY CONSTRAINT DF_Tabela_id DEFAULT (NEWID()), col1 CHAR(16) NOT NULL, col2 INT NOT NULL, ); GO
Przyklad dodania default, dla istniejacej tabeli:
ALTER TABLE dbo.Tabela ADD CONSTRAINT DF_Tabela_id DEFAULT (NEWID()) FOR id
lub (tylko dla 2005)
ALTER TABLE dbo.Tabela ADD CONSTRAINT DF_Tabela_id DEFAULT (NEWSEQUENTIALID()) FOR id
Ta druga opcja sprawia, ze kolejne guidy beda wyzwalane jako nastepujace po sobie, dzieki temu bedzie potencjalnie mniejsza fragmentacja indeksu.
Pozdr.
Sylwester Lewandowski - 01-04-2007 00:03
> Sowiecki Agent napisał(a):
>> IF (NEW.id_pole IS NULL) THEN >> NEW.id_pole = new_id();
Gdybys jednak musial korzystac z wyzwalacza, ja bym probowal tak: (nie sprawdzalem, tak tylko "na oko")
IF (inserted.id_pole IS NULL) inserted.id_pole = NEWID()
Pozdr.
Sowiecki Agent - 01-04-2007 00:03
Sylwester Lewandowski napisał(a): > >> Sowiecki Agent napisał(a): > >>> IF (NEW.id_pole IS NULL) THEN >>> NEW.id_pole = new_id(); > > Gdybys jednak musial korzystac z wyzwalacza, ja bym probowal tak: > (nie sprawdzalem, tak tylko "na oko") > > IF (inserted.id_pole IS NULL) > inserted.id_pole = NEWID() >
dziekuje.
-- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
Sowiecki Agent - 01-04-2007 00:03
> Ta druga opcja sprawia, ze kolejne guidy beda wyzwalane jako nastepujace > po sobie, dzieki temu bedzie potencjalnie mniejsza fragmentacja indeksu.
na chlopski rozum co to oznacza ?
P. -- http://www.niesfornazyta.pl/ Pierwszy stacjonarny czytnik for typu phpBB/phpBBbyPrzemo (windows/linux) Od dziś możesz korzystać z fora tak jak z usenetu !
Sylwester Lewandowski - 03-04-2007 00:07
Sowiecki Agent napisał(a): > >> Ta druga opcja sprawia, ze kolejne guidy beda wyzwalane jako >> nastepujace po sobie, dzieki temu bedzie potencjalnie mniejsza >> fragmentacja indeksu. > > > na chlopski rozum co to oznacza ? > > P.
Fragmentacja indeksu?
Strony z danymi są przechowywane fizycznie w innym porządku niż porządek logiczny (np inna kolejność) lub są "puste miejsca" w indeksie i zajmuje on wiecej miejsca niż powinien.
Pozdr.
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.plmorebeer.opx.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 |
|