Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók
Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
Az időbeli táblák (más néven rendszerverziózott időbeli táblák) egy adatbázis-funkció, amely beépített támogatást nyújt a táblában tárolt adatokra vonatkozóan, nem csak az aktuális adatokhoz.
Rendszer által verziózott temporális táblák használatának első lépései, és tekintse át a temporális táblák használatának forgatókönyveit.
Mi az a rendszer-verziózott temporális tábla?
A rendszerverziós időbeli tábla egy olyan felhasználói táblatípus, amely teljes adatváltozások előzményeit őrizve lehetővé téve az időbeli elemzést. Ezt a típusú időbeli táblát rendszer-verziójú időtáblának nevezik, mivel a rendszer kezeli minden sorra (azaz az Database Engine-re) érvényességi időszakát.
Minden temporális tábla két explicit módon definiált oszlopból áll, mindegyik datetime2 adattípussal. Ezeket az oszlopokat korszakoszlopoknak nevezik. A Database Engine kizárólag ezeket az időszakoszlopokat használja arra, hogy rögzítse az egyes sorok érvényességi időszakát, amikor egy sort módosítanak. A fő táblázatot, amely aktuális adatokat tárol, az aktuális táblának, vagy időbeli táblanak nevezik.
Ezen időszakoszlopok mellett egy időbeli tábla egy tükrözött sémával rendelkező másik táblára mutató hivatkozást is tartalmaz, az úgynevezett előzménytáblát. A rendszer az előzménytáblával automatikusan tárolja a sor előző verzióját minden alkalommal, amikor egy sor frissül vagy törlődik az időtáblában. A temporális tábla létrehozása során megadhat egy meglévő előzménytáblát (amelynek séma-kompatibilisnek kell lennie), vagy engedélyezheti, hogy a rendszer létrehozhasson egy alapértelmezett előzménytáblát.
Miért időleges?
A valódi adatforrások dinamikusak, és az üzleti döntések gyakran az elemzők által az adatok fejlődéséből származó felismerésekre támaszkodnak. A temporális táblák használati esetei a következők:
- Az adatváltozások naplózása és szükség esetén az adatelemzés elvégzése
- Az adatok állapotának rekonstruálása a múlt bármely időpontjában
- Trendek kiszámítása az idő függvényében
- A döntéstámogatási alkalmazások lassan változó dimenziójának fenntartása
- Véletlen adatváltozások és alkalmazáshibák helyreállítása
Hogyan működik az időbeli munka?
A táblák rendszerverzió-használatát táblapárként implementáljuk: egy aktuális táblát és egy előzménytáblát. Ezekben a táblázatokban két extra datetime2 oszlop határozza meg az egyes sorok érvényességi időszakát:
Időszak kezdő oszlopa: A rendszer itt rögzíti a sor kezdési időpontját, amely általában
ValidFromoszlopként van jelölve.Időszak vége oszlop: A rendszer az adott sor befejezési idejét rögzíti ebben az oszlopban, amelyet általában
ValidTooszlopként jelölnek.
Az aktuális táblázat az egyes sorokhoz aktuális értéket tartalmazza. Az előzménytáblában minden sor minden korábbi értéke (régi verzió) szerepel, ha vannak ilyenek, és annak az időszaknak a kezdési és befejezési idejét, amelyre érvényes volt.
Az alábbi szkript az alkalmazottak adatait tartalmazó forgatókönyvet mutatja be:
CREATE TABLE dbo.Employee
(
[EmployeeID] INT NOT NULL PRIMARY KEY CLUSTERED,
[Name] NVARCHAR (100) NOT NULL,
[Position] VARCHAR (100) NOT NULL,
[Department] VARCHAR (100) NOT NULL,
[Address] NVARCHAR (1024) NOT NULL,
[AnnualSalary] DECIMAL (10, 2) NOT NULL,
[ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START,
[ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
További információ: Rendszerverziójú temporális tábla létrehozása.
Hozzáadások: A rendszer az
ValidFromoszlop értékét a jelenlegi tranzakció kezdő idejének (az UTC időzónában) állítja be a rendszer óraóra alapján, és azValidTooszlop értékét a maximális értéknek rendeli .9999-12-31Ez nyitottként jelöli meg a sort.Frissítések: A rendszer a sor korábbi értékét a történettáblázatban tárolja, és az
ValidTooszlop értékét a jelenlegi tranzakció kezdeti idejére (az UTC időzónában) állítja be a rendszer óraóra alapján. Ez lezártként jelöli meg a sort, és egy olyan pontot rögzít, amelyre a sor érvényes volt. Az aktuális táblázatban a sor frissül az új értékével, és a rendszer a rendszer óra alapján beállítja aValidFromoszlop értékét a tranzakció kezdési időpontjára (az UTC időzónában). AValidTooszlop aktuális táblázatának frissített sorának értéke továbbra is a9999-12-31maximális értéke marad.Törlés: A rendszer a sor korábbi értékét a történettáblázatban tárolja, és
ValidToaz oszlop értékét a jelenlegi tranzakció kezdeti idejére állítja be (az UTC időzónában) a rendszer órajel alapján. Ez lezártként jelöli meg a sort, és egy olyan időszakot rögzít, amelyre az előző sor érvényes volt. Az aktuális táblában a sor el lesz távolítva. Az aktuális tábla lekérdezései nem ezt a sort adják vissza. Csak az előzményadatokkal foglalkozó lekérdezések a sorokat lezáró adatokat ad vissza.Összevonás: A művelet pontosan úgy viselkedik, mintha legfeljebb három utasítást (egy
INSERT, egyUPDATEés/vagy aDELETE) hajtanának végre, attól függően, hogy azMERGEutasítás mit jelöl meg műveletként.
A rendszerben datetime2 oszlopokban rögzített időpontok a tranzakció kezdő időpontján alapulnak. Az egyetlen tranzakcióban beszúrt összes sor például az SYSTEM_TIME időszak kezdetének megfelelő oszlopban rögzített UTC-idővel rendelkezik.
Ha adatmódosítási lekérdezéseket futtat egy időbeli táblán, az adatbázismotor hozzáad egy sort az előzménytáblához, még akkor is, ha az oszlopértékek nem változnak.
Hogyan kérdezhetem le az időbeli adatokat?
A SELECT ... FROM <table> utasítás új záradékkal rendelkezik FOR SYSTEM_TIME, amely öt időspecifikus alklámot tartalmaz az aktuális és az előzménytáblák adatainak lekérdezéséhez. Ez az új SELECT utasításszintaxis közvetlenül egyetlen táblán támogatott, több összekapcsoláson keresztül terjed, valamint több időbeli táblán alapuló nézeteken keresztül.
Ha a FOR SYSTEM_TIME klauzulatot az öt almondat egyikével használjuk egy lekérdezésben, az eredmények az időbeli táblázat történelmi adatait tartalmazzák, ahogy azt a következő képen is látható.
Az alábbi lekérdezés olyan alkalmazott sorverziókat keres a WHERE EmployeeID = 1000 szűrőfeltétel alapján, amelyek legalább részben aktívak voltak a 2021. január 1. és 2022. január 1. közötti időszakban (beleértve a felső határt is).
SELECT *
FROM Employee FOR SYSTEM_TIME
BETWEEN '2021-01-01 00:00:00.0000000' AND '2022-01-01 00:00:00.0000000'
WHERE EmployeeID = 1000
ORDER BY ValidFrom;
FOR SYSTEM_TIME kiszűri azokat a sorokat, amelyek érvényességi ideje nulla (ValidFrom = ValidTo).
A Database Engine generálja ezeket a sorokat, ha ugyanazon a fő kulcson több frissítést végzel ugyanazon a tranzakción belül. Ebben az esetben az időbeli lekérdezés csak a tranzakciók előtti sorverziókat, a tranzakciók utáni aktuális sorokat adja vissza.
Ha ezeket a sorokat bele kell foglalnia az elemzésbe, közvetlenül kérdezheti le az előzménytáblát.
A következő táblázatban ValidFrom a Minősítő sorok oszlopban a lekérdezett tábla ValidFrom oszlopának értékét, ValidTo pedig a lekérdezett tábla ValidTo oszlopában lévő értéket jelöli. A teljes szintaxist és példákat lásd a FROM záradékban, valamint a JOIN, APPLY, PIVOT, és a Rendszerverziózású temporális táblák lekérdezésecímű részben.
| Expression | Kvalifikáló sorok | Megjegyzés: |
|---|---|---|
AS OF
date_time |
ValidFrom <=
AND ValidTo > date_timedate_time |
Olyan táblázatot ad vissza, amely a múltban megadott időpontban aktuális értékeket tartalmazó sorokat tartalmaz. Belsőleg egy egyesítést hajtunk végre az időbeli tábla és az előzménytáblája között. A rendszer szűri az eredményeket, hogy az date_time paraméter által megadott időpontban érvényes sorok értékeit adja vissza. A sor értéke akkor tekinthető érvényesnek, ha a system_start_time_column_name érték kisebb vagy egyenlő a date_time paraméter értékénél, és a system_end_time_column_name érték nagyobb, mint a date_time paraméter értéke. |
FROM
kezdési_dátum_időTObefejezési_dátum_idő |
ValidFrom <
befejezési_dátum_és_időAND ValidTo >kezdési_dátum_és_idő |
A megadott időtartományon belül aktív összes sorverzió értékeit tartalmazó táblát ad vissza, függetlenül attól, hogy az argumentum FROM paraméterértéke előtt kezdtek aktívak lenni, vagy a argumentum TO paraméterértéke után már nem voltak aktívak. Belsőleg egy egyesítést hajtunk végre az időbeli tábla és az előzménytáblája között. A rendszer szűri az eredményeket, hogy visszaadja az összes olyan sorverzió értékeit, amelyek a megadott időtartomány alatt bármikor aktívak voltak. A FROM végpont által meghatározott alsó határon nem aktív sorok nem szerepelnek, és a TO végpont által meghatározott felső határon aktívvá vált rekordok szintén nem lesznek belefoglalva. |
BETWEEN
kezdési_dátum_időANDbefejezési_dátum_idő |
ValidFrom <=
befejezési_dátum_és_időAND ValidTo >kezdési_dátum_és_idő |
A FOR SYSTEM_TIME FROMstart_date_timeTOend_date_time leírásában szereplővel megegyezik, kivéve, hogy a visszaadott sorok táblázata tartalmazza azokat a sorokat, amelyek a end_date_time végpont által meghatározott felső határon lettek aktívvá. |
CONTAINED IN (kezdési_dátum_idő, befejezési_dátum_idő) |
ValidFrom >=
kezdési_dátum_időAND ValidTo <=befejezési_dátum_idő |
Egy olyan táblát ad vissza, amely az összes olyan sorverzió értékeit tartalmazza, amelyek a CONTAINED IN argumentum két időszakértékével meghatározott megadott időtartományon belül lettek megnyitva és bezárva. Azokat a sorokat is belefoglaljuk, amelyek pontosan az alsó határon váltak aktívvá, vagy a felső határon már nem aktívak. |
ALL |
Összes sor | Az aktuális és az előzménytáblához tartozó sorok egyesítését adja vissza. |
Az időszakoszlopok elrejtése
El lehet rejteni az időszakos oszlopokat, így SELECT azok a lekérdezések, amelyek nem hivatkoznak rájuk explicit, nem adják vissza ezeket az oszlopokat, például SELECT * FROM <table>.
Rejtett oszlop visszaadásához explicit módon hivatkoznia kell a lekérdezés rejtett oszlopára. Hasonlóképpen a(z) INSERT és BULK INSERT utasítások úgy folytatódnak, mintha ezek az új időszakoszlopok nem lennének jelen (és az oszlopértékek automatikusan kitöltődnek).
A HIDDEN záradék használatával kapcsolatos részletekért lásd a CREATE TABLE és ALTER TABLE részt.
Samples
ASP.NET: Tekintse meg a ASP.NET Core webalkalmazást, hogy megtanulja, hogyan hozhat létre időalapú alkalmazást időbeli táblák használatával.
AdventureWorks mintaadatbázis: Töltse le az SQL Server AdventureWorks-adatbázisát, amely tartalmazza a temporális táblafunkciókat.
Kapcsolódó tartalom
- Időbeli táblázatokkal kapcsolatos megfontolások és korlátozások
- Az előzményadatok megőrzésének kezelése rendszerverziójú időbeli táblákban
- partíció temporális táblákkal
- Temporális táblarendszer konzisztenciájának ellenőrzése
- Temporális tábla biztonság
- Időbeli tábla metaadatnézetei és függvényei
- Dolgozzon memóriaoptimalizált rendszerverziójú időbeli táblázatokkal
- Rendszerverziójú temporális tábla létrehozása
- Adatok módosítása rendszerverziójú temporális táblában
- Adatok lekérdezése rendszerverziójú temporális táblában
- Kezdje el használni a rendszerverziójú temporális táblákat
- rendszerverziójú időtáblák memóriaoptimalizált táblákkal