CREATE SEQUENCE (Transact-SQL)

  • 04/11/2017
  • 10 minutes to read
    • W
    • c
    • r
    • M
    • m
    • +7

Applies to: yesSQL Server (all supported versions) YesAzure SQL Database

Creates a sequence object and specifies its properties. A szekvencia egy felhasználó által definiált sémához kötött objektum, amely numerikus értékek sorozatát generálja annak a specifikációnak megfelelően, amellyel a szekvencia létrejött. A numerikus értékek sorozata egy meghatározott időközönként növekvő vagy csökkenő sorrendben jön létre, és konfigurálható újraindításra (ciklus), ha kimerül. A szekvenciák, az identitásoszlopokkal ellentétben, nem kapcsolódnak konkrét táblákhoz. Az alkalmazások egy szekvenciaobjektumra hivatkoznak a következő érték lekéréséhez. A szekvenciák és táblázatok közötti kapcsolatot az alkalmazás szabályozza. A felhasználói alkalmazások hivatkozhatnak egy szekvencia objektumra, és összehangolhatják az értékeket több sorban és táblában.

a sorok beszúrásakor generált identitásoszlop-értékekkel ellentétben az alkalmazás a sor beszúrása nélkül megszerezheti a következő sorszámot a függvény következő értékének meghívásával. Használja sp_sequence_get_range, hogy több sorszámot egyszerre.

a szekvencia létrehozása és a függvény következő értéke egyaránt használható információkat és forgatókönyveket lásd a szekvencia számok című részben.

téma link ikon Transact-SQL szintaxis konvenciók

Syntax

CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ] 

megjegyzés

az SQL Server 2014 és korábbi verzióinak Transact-SQL szintaxisának megtekintéséhez lásd az előző verziók dokumentációját.

argumentumok

sequence_name
megadja azt az egyedi nevet, amellyel a szekvencia ismert az adatbázisban. A típus sysname.

meghatározza a szekvencia objektum határait. Az új szekvencia objektum alapértelmezett minimális értéke a szekvencia objektum adattípusának minimális értéke. Ez a tinyint adattípus esetében nulla, az összes többi adattípus esetében pedig negatív szám.

tulajdonság, amely meghatározza, hogy a szekvencia objektumnak újra kell-e indulnia a minimális értékről (vagy a csökkenő szekvencia objektumok esetében a maximumról), vagy kivételt kell-e dobnia, ha a minimális vagy maximális értéket túllépi. Az új sorozatobjektumok alapértelmezett ciklusbeállítása a Nincs ciklus.

Megjegyzés

A sorozat ciklusa a minimális vagy maximális értékről indul újra, nem a kezdő értékről.

/ nincs gyorsítótár]
növeli a szekvencia objektumokat használó alkalmazások teljesítményét azáltal, hogy minimalizálja a sorszámok létrehozásához szükséges lemezes IOs-ek számát. Alapértelmezés szerint gyorsítótár.

ha például 50-es gyorsítótár-méretet választ, az SQL Server nem tárol 50 egyedi értéket. Csak az aktuális értéket és a gyorsítótárban maradt értékek számát tárolja. Ez azt jelenti, hogy a gyorsítótár tárolásához szükséges memória mennyisége mindig a szekvencia objektum adattípusának két példánya.

Megjegyzés

Ha a gyorsítótár opció engedélyezve van a gyorsítótár méretének megadása nélkül, az adatbázismotor kiválaszt egy méretet. A felhasználók azonban nem támaszkodhatnak arra, hogy a kiválasztás következetes. A Microsoft értesítés nélkül megváltoztathatja a gyorsítótár méretének kiszámításának módját.

a gyorsítótár opcióval történő létrehozáskor egy váratlan leállítás (például áramkimaradás) a gyorsítótárban maradt sorszámok elvesztését eredményezheti.

Általános megjegyzések

a sorszámok az aktuális tranzakció hatókörén kívül keletkeznek. Felhasználják őket, függetlenül attól, hogy a sorszámot használó tranzakció elkötelezett-e vagy visszahúzódik-e. A duplikált érvényesítés csak akkor történik meg, ha a rekord teljesen kitöltött. Ez bizonyos esetekben azt eredményezheti, hogy ugyanazt a számot egynél több rekordhoz használják a létrehozás során, de ezt követően másolatként azonosítják. Ha ez megtörténik, és más automatikus számértékeket alkalmaznak a következő rekordokra, ez az automatikus számértékek és a várható viselkedés közötti rést eredményezheti.

gyorsítótár-kezelés

a teljesítmény javítása érdekében az SQL Server előre kiosztja a gyorsítótár argumentum által megadott sorszámok számát.

például egy új szekvencia jön létre, amelynek kezdő értéke 1, gyorsítótár mérete pedig 15. Amikor az első érték szükséges, az 1-től 15-ig terjedő értékek a memóriából állnak rendelkezésre. Az utolsó gyorsítótárazott érték (15) a lemez rendszertábláiba kerül. Ha mind a 15 számot használja, a következő kérés (a 16-os számhoz) a gyorsítótár újbóli kiosztását eredményezi. Az új Utolsó gyorsítótárazott érték (30) a rendszertáblákba kerül.

Ha az adatbázismotor 22 szám használata után leáll, a memóriában a következő tervezett sorszámot (23) a rendszertáblákba írja, helyettesítve a korábban tárolt számot.

miután az SQL Server újraindul, és szükség van egy sorszámra, a rendszer a rendszertáblázatokból beolvassa a kezdő számot (23). A 15 szám (23-38) gyorsítótár mennyisége a memóriához van rendelve, a következő nem gyorsítótár szám (39) pedig a rendszertáblákba kerül.

Ha az adatbázismotor rendellenesen leáll egy olyan esemény miatt, mint például áramkimaradás, a sorozat újraindul a rendszertáblázatokból leolvasott számmal (39). A memóriához rendelt (de a felhasználó vagy az alkalmazás által soha nem kért) sorszámok elvesznek. Ez a funkció hézagokat hagyhat, de garantálja, hogy ugyanazt az értéket soha nem adják ki kétszer egyetlen szekvencia objektumra, kivéve, ha ciklusként definiálják, vagy manuálisan újraindítják.

a gyorsítótár a memóriában marad az aktuális érték (az utolsó kiadott érték) és a gyorsítótárban maradt értékek számának követésével. Ezért a gyorsítótár által használt memória mennyisége mindig a szekvencia objektum adattípusának két példánya.

A gyorsítótár Argumentumának beállítása Nincs gyorsítótár írja az aktuális szekvenciaértéket a rendszertáblákba minden alkalommal, amikor egy szekvenciát használnak. Ez lassíthatja a teljesítményt a lemezhez való hozzáférés növelésével, de csökkenti a nem kívánt hiányosságok esélyét. Hiányosságok akkor is előfordulhatnak, ha a számokat a következő érték vagy az sp_sequence_get_range függvények használatával kérik, de akkor a számokat vagy nem használják, vagy nem kötelező tranzakciókban használják.

Ha egy szekvencia objektum a gyorsítótár opciót használja, ha újraindítja a szekvencia objektumot, vagy megváltoztatja a növekmény, a ciklus, a MINVALUE, a MAXVALUE vagy a gyorsítótár méretének tulajdonságait, akkor a gyorsítótár a változás bekövetkezése előtt a rendszertáblákba kerül. Ezután a gyorsítótár újratöltésre kerül az aktuális értékkel kezdve (azaz egyetlen számot sem hagy ki). A gyorsítótár méretének megváltoztatása azonnal hatályba lép.

gyorsítótár beállítás, Ha a gyorsítótárban tárolt értékek rendelkezésre állnak

a következő folyamat minden alkalommal megtörténik, amikor egy szekvencia objektumot kérnek a gyorsítótár beállítás következő értékének létrehozásához, ha a szekvencia objektumhoz nem használt értékek állnak rendelkezésre a memóriában lévő gyorsítótárban.

  1. a szekvencia objektum következő értéke kerül kiszámításra.

  2. a szekvencia objektum új aktuális értéke frissül a memóriában.

  3. a számított érték visszatér a hívó utasításhoz.

gyorsítótár opció a gyorsítótár kimerülésekor

a következő folyamat történik minden alkalommal, amikor egy szekvencia objektumot kérnek a gyorsítótár opció következő értékének létrehozásához, ha a gyorsítótár kimerült:

  1. a szekvencia objektum következő értéke kiszámításra kerül.

  2. az új gyorsítótár utolsó értéke kerül kiszámításra.

  3. a sequence objektum rendszertáblázatának sora zárolva van, és a 2.lépésben kiszámított érték (az utolsó érték) be van írva a rendszertáblába. A gyorsítótár-kimerült xevent ki van kapcsolva, hogy értesítse a felhasználót az új fennmaradt értékről.

nincs gyorsítótár opció

a következő folyamat történik minden alkalommal, amikor egy szekvencia objektumot kérnek a Nincs gyorsítótár opció következő értékének előállításához:

  1. a szekvencia objektum következő értékét számítják ki.

  2. a szekvencia objektum új aktuális értéke a rendszertáblába kerül.

  3. a számított érték visszatér a hívó utasításhoz.

metaadatok

a szekvenciákkal kapcsolatos információkért, lekérdezés sys.szekvenciák.

biztonság

engedélyek

szekvencia létrehozása, módosítása vagy vezérlési engedély szükséges a sémán.

  • A db_owner és db_ddladmin rögzített adatbázis-szerepkörök tagjai létrehozhatnak, megváltoztathatnak és eldobhatnak szekvenciaobjektumokat.

  • A db_owner és db_datawriter rögzített adatbázis-szerepkörök tagjai frissíthetik a szekvencia objektumokat azáltal, hogy számokat generálnak.

a következő példa engedélyt ad az AdventureWorks\Larry felhasználónak szekvenciák létrehozására a Tesztsémában.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO 

egy szekvencia objektum tulajdonjoga átruházható az ALTER AUTHORIZATION utasítás használatával.

Ha egy szekvencia felhasználó által definiált adattípust használ, a szekvencia létrehozójának rendelkeznie kell a típusra vonatkozó hivatkozási engedéllyel.

Audit

a szekvencia létrehozásának ellenőrzéséhez figyelje a SCHEMA_OBJECT_CHANGE_GROUP értéket.

példák

a szekvenciák létrehozására és a függvény következő értékének sorozatszámok létrehozására vonatkozó példáit lásd: sorozatszámok.

a következő példák többsége szekvenciaobjektumokat hoz létre egy teszt nevű sémában.

a Tesztséma létrehozásához hajtsa végre a következő utasítást.

CREATE SCHEMA Test ; GO 

A. 1-gyel növelő szekvencia létrehozása

a következő példában Thierry létrehoz egy CountBy1 nevű szekvenciát, amely minden használat során eggyel növekszik.

CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO 

B. olyan szekvencia létrehozása, amely 1-gyel csökken

a következő példa 0-nál kezdődik, és minden használat során eggyel számol negatív számokra.

CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO 

C. 5-tel növelő szekvencia létrehozása

a következő példa olyan szekvenciát hoz létre, amely minden használat során 5-tel növekszik.

CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO 

D. egy kijelölt számmal kezdődő sorozat létrehozása

táblázat importálása után Thierry észreveszi, hogy a legmagasabb használt azonosító szám 24 328. Thierry – nek szüksége van egy szekvenciára, amely 24 329-től kezdődő számokat generál. A következő kód létrehoz egy sorozatot, amely 24 329-tel kezdődik, és 1-gyel növekszik.

CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO 

E. Szekvencia létrehozása alapértelmezett értékekkel

a következő példa az alapértelmezett értékek felhasználásával hoz létre szekvenciát.

CREATE SEQUENCE Test.TestSequence ; 

a szekvencia tulajdonságainak megtekintéséhez hajtsa végre a következő utasítást.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ; 

a kimenet részleges listája bemutatja az alapértelmezett értékeket.

Output Default value
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. szekvencia létrehozása egy adott adattípussal

a következő példa egy sorozatot hoz létre a smallint adattípus használatával, -32 768 és 32 767 között.

CREATE SEQUENCE SmallSeq AS smallint ; 

G. szekvencia létrehozása az összes argumentum felhasználásával

a következő példa decseq nevű szekvenciát hoz létre a decimális adattípus használatával, amelynek tartománya 0-tól 255-ig terjed. A szekvencia 125-tel kezdődik, és minden egyes szám létrehozásakor 25-tel növekszik. Mivel a szekvencia úgy van konfigurálva, hogy ciklusba kerüljön, ha az érték meghaladja a maximális 200 értéket, a szekvencia a minimális 100 értéken újraindul.

CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ; 

Az első érték megtekintéséhez hajtsa végre a következő utasítást; a START WITH opció 125.

SELECT NEXT VALUE FOR Test.DecSeq; 

hajtsa végre az utasítást még háromszor, hogy visszaadja a 150, 175 és 200 értéket.

hajtsa végre újra az utasítást, hogy lássa, hogyan tér vissza a kezdő érték aMINVALUE 100 opcióra.

hajtsa végre a következő kódot a gyorsítótár méretének megerősítéséhez és az aktuális érték megtekintéséhez.

SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ; 

Lásd még

ALTER szekvencia (Transact-SQL)
csepp szekvencia (Transact-SQL)
következő érték (Transact-SQL)
szekvencia számok

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.