﻿
{"id":4927,"date":"2016-09-23T13:55:37","date_gmt":"2016-09-23T13:55:37","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4927"},"modified":"2016-09-27T05:00:48","modified_gmt":"2016-09-27T05:00:48","slug":"sql-server-2016-temporal-tables","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/sql-server-2016-temporal-tables\/","title":{"rendered":"SQL Server 2016 &#8211; Temporal Tables"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Kan\u0131mca Yaz\u0131l\u0131m Uzman\u0131 olman\u0131n temel ve olmazsa olmaz \u015fartlar\u0131ndan biriside do\u011fru bir raporlama ve takip mekanizmas\u0131 olu\u015fturmaktan ge\u00e7mektedir. Takip s\u00fcrecini kontrol edecek olan bu mekanizma, hem detayl\u0131 raporlama hem de projenin ya\u015fam d\u00f6ng\u00fcs\u00fcnde at\u0131lan her ad\u0131m\u0131 kayda alacak, yap\u0131lan t\u00fcm i\u015flemleri gerekti\u011fi taktirde biz i\u015fin sorumlular\u0131na an be an listeyecek bir \u00f6zellikte olmal\u0131d\u0131r. Tabi ki de bu sistem projenin hem yaz\u0131l\u0131m hem de veritaban\u0131 olmak \u00fczere ikili saf olarak ortak bir organizasyonla ger\u00e7ekle\u015ftirilecektir. Haliyle \u015fuanda ilgili konumuzun esas\u0131n\u0131 te\u015fkil edecek olan nokta veritaban\u0131 k\u0131sm\u0131n\u0131 ilgilendirmekte ve bu yap\u0131lanmaya SQL Server 2016 versiyonuyla gelen yeni bir teknikle yakla\u015f\u0131m sergileyece\u011fiz. Bu tekni\u011fimize <strong><em>Temporal Tables<\/em><\/strong> diyece\u011fiz.<\/p>\n<p>Temporal Tables \u00f6zelli\u011fi, <em>Zamansal Tablolar<\/em> diye nitelendirebilece\u011fimiz bir SQL Server 2016 yenili\u011fidir. Bu \u00f6zelli\u011fin \u00f6zeti, veritaban\u0131nda yap\u0131lan Data Manipulation Language(DML) i\u015flemlerini raporlamam\u0131z\u0131 sa\u011flayan bir yap\u0131d\u0131r. Biz her ne kadar Temporal Tables olarak hitap edecek olsakta, internet yahut ba\u015fka kaynaklarda &#8220;<strong><em>System-Versioned Table<\/em><\/strong>&#8221; \u015feklinde bir ifadede g\u00f6rebilece\u011finizden dolay\u0131 \u00f6ncelikle \u015fa\u015f\u0131rmaman\u0131z\u0131 s\u00f6yl\u00fcyor, bu iki ifadeninde ayn\u0131 \u00f6zelli\u011fin farkl\u0131 s\u0131fatlar\u0131 oldu\u011funu belirtiyorum.<\/p>\n<p>Hat\u0131rlarsan\u0131z e\u011fer \u015fuana kadar yapt\u0131\u011f\u0131m\u0131z raporlama ve takip sistemlerinde izledi\u011fimiz ad\u0131mlar olu\u015fturdu\u011fumuz tablolara \u00f6zel &#8220;log&#8221; tablolar\u0131 yahut dosyalar\u0131 olu\u015fturmaktan ibaretti. Yap\u0131lan her i\u015flemi ya log tablolar\u0131na sorgular e\u015fli\u011finde kay\u0131t eder yahut <a href=\"http:\/\/www.gencayyildiz.com\/blog\/transact-sql-triggerstetikleyiciler\/\" target=\"_blank\">trigger<\/a>&#8216;lar arac\u0131l\u0131\u011f\u0131yla takip s\u00fcrecini ger\u00e7ekle\u015ftirirdik.<\/p>\n<p>Temporal Tables \u00f6zelli\u011fi ile bu s\u00fcreci hem teknik olarak daha kullan\u0131\u015fl\u0131, hemde pratikte daha maliyetli bir \u015fekilde ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z.<\/p>\n<p>Temporal Tables \u00f6zelli\u011finin bize sa\u011flayaca\u011f\u0131 art\u0131lar\u0131 k\u0131saca maddelersek e\u011fer;<\/p>\n<ul>\n<li>Tablomuzda bulunan kay\u0131tlar\u0131n zaman i\u00e7indeki de\u011fi\u015fikliklerinin(update) izlenmesi ve takip edilmesi,<\/li>\n<li>Tablo \u00fczerinde yanl\u0131\u015fl\u0131kla yap\u0131lan delete ve update sorgular\u0131n\u0131n geri getirilmesi,<\/li>\n<li>Bir verinin belirli bir zamana yahut zaman aral\u0131\u011f\u0131na odakl\u0131 izlenebilmesi.<\/li>\n<\/ul>\n<p>\u015feklinde olacakt\u0131r. \u015eimdi burada dikkatinizi \u00e7ekmek istedi\u011fim bir nokta var. Fark\u0131ndaysan\u0131z yukar\u0131daki maddeleri olduk\u00e7a k\u0131sa tuttum. Bunun sebebi, fazla uzatmadan sonuncu maddeyi bir an \u00f6nce g\u00f6zlerinizin \u00f6n\u00fcne getirmekti \ud83d\ude42<\/p>\n<p>G\u00f6z\u00fcn\u00fcz sonuncu maddeye tekrardan gitmi\u015fken ben anlat\u0131m\u0131ma devam edeyim bari&#8230; Maddede anlatt\u0131\u011f\u0131m gibi tablomuzdaki herhangi bir verinin zamansal takibini ger\u00e7ekle\u015ftirebiliyorsak e\u011fer bu zamanlamay\u0131 tutacak bir alana ihtiyac\u0131m\u0131z olacakt\u0131r. Ee do\u011fal olarak bu alanlar\u0131m\u0131z fiziksel tablomuzun i\u00e7inde olacakt\u0131r. Ayr\u0131ca raporlama ve verilerin zamansal izlenimi i\u00e7in\u00a0Temporal Tables \u00f6zelli\u011finin getirisi olan ve History diye nitelendirdi\u011fimiz tablonun birebir benzeri olan log dosyam\u0131z\u0131 olu\u015fturaca\u011f\u0131z.\u00a0Bu tablonun olu\u015fturulmas\u0131yla ilgili yaz\u0131m\u0131z\u0131n devam\u0131nda detayl\u0131 a\u00e7\u0131klama yapaca\u011f\u0131m i\u00e7in \u015fimdilik bahsetmiyorum.<\/p>\n<p>\u015eimdi \u015f\u00f6yle d\u00fc\u015f\u00fcnece\u011fiz. Bir verinin, zaman i\u00e7indeki de\u011fi\u015fimini takip edeceksek e\u011fer, o verinin;<\/p>\n<ul style=\"list-style-type: circle;\">\n<li>&#8220;\u0130lk \u0130\u015flem Tarihi&#8221;<\/li>\n<li>&#8220;Son \u0130\u015flem Tarihi&#8221;<\/li>\n<\/ul>\n<p>olmak \u00fczere iki farkl\u0131 bilgisini tutaca\u011f\u0131z. Bu bilgiler &#8220;datetime2&#8221; tipinde kolonlarda tutulacakt\u0131r. \u00d6rnek olarak ilk i\u015flem tarihi i\u00e7in &#8220;StartDate&#8221;, son i\u015flem tarihi i\u00e7in ise &#8220;EndDate&#8221; olmak \u00fczere ikitane kolon olu\u015fturmu\u015f olal\u0131m.<\/p>\n<p>\u015eimdi bir verinin zamansal takibinde bu iki kolon \u015fu \u015fekilde faaliyet g\u00f6sterecektir.<\/p>\n<ul>\n<li><em><strong>Veri \u0130lk Kaydedildi\u011finde (Insert)<\/strong><\/em><br \/>\nVeri ilk kaydedilece\u011fi s\u0131rada &#8220;StartDate&#8221; kolonuna\u00a0verinin kaydedilme tarih ve zamansal de\u011ferini, &#8220;EndDate&#8221; kolonuna ise daha veriyle ilgili ba\u015fka i\u015flem yap\u0131lmad\u0131\u011f\u0131 i\u00e7in &#8220;datetime2&#8221; tipinin alabilece\u011fi son de\u011fer olan &#8220;9999-12-31 23:59:59.9999999&#8221; de\u011ferini tutacakt\u0131r.<\/li>\n<li><em><strong>Verinin \u0130lk G\u00fcncellendi\u011finde (Update)<\/strong><\/em><br \/>\nVeri g\u00fcncellenece\u011fi s\u0131rada benzer \u015fekilde &#8220;StartDate&#8221;\u00a0kolonuna verinin g\u00fcncellenme\u00a0tarih ve zamansal de\u011ferini, &#8220;EndDate&#8221; kolonuna ise\u00a0yukar\u0131da oldu\u011fu gibi &#8220;datetime2&#8221; tipinin alabilece\u011fi son veriyi yazacakt\u0131r. Lakin veri g\u00fcncelleme i\u015flemi yap\u0131ld\u0131\u011f\u0131ndan dolay\u0131\u00a0Temporal Tables \u00f6zelli\u011fi devreye girecek ve verinin bir \u00f6nceki halini kayda alacakt\u0131r. \u0130\u015fte bu kay\u0131t i\u015fleminde\u00a0Temporal Tables&#8217;a \u00f6zel bir History diye nitelendirdi\u011fimiz tablomuzda i\u015flem ger\u00e7ekle\u015ftirilecektir. Burada fiziksel tablomuzla History log tablomuz aras\u0131nda a\u015fa\u011f\u0131daki ba\u011f vard\u0131r;Verimiz <span style=\"text-decoration: underline;\">ilk defa<\/span>\u00a0g\u00fcncellendi\u011finden dolay\u0131, g\u00fcncellenmeden \u00f6nceki hali\u00a0History log tablosuna ta\u015f\u0131nmaktad\u0131r. Bu tabloda &#8220;StartDate&#8221; kolonuna ilgili verinin orjinal halindeki &#8220;StartDate&#8221; kolonundaki tarihi alacakt\u0131r. &#8220;EndDate&#8221; tablosunada o anki tarih ve zaman verisini yazacakt\u0131r.Yani ilk g\u00fcncelleme durumunda History tablosundaki &#8220;StartDate&#8221; kolonu, fiziksel tablonun &#8220;StartDate&#8221; kolonundan ge\u00e7irilecektir. Bunun sebebi, ilgili verinin \u00f6nceden History tablosunda bir kayd\u0131n\u0131n bulunmamas\u0131d\u0131r. History tablosunda kayd\u0131 olan veriler(<em>bir ba\u015fka deyi\u015fle ilk g\u00fcncellemeden sonraki g\u00fcncellemeler<\/em>) i\u00e7in a\u015fa\u011f\u0131daki gibi bir mant\u0131kta hareket edilmektedir.<\/li>\n<li><em><strong>Verinin Sonraki G\u00fcncellemelerinde (Update)<\/strong><\/em><br \/>\nVerimiz ilkten sonraki t\u00fcm g\u00fcncellemelerinde \u015f\u00f6yle bir mant\u0131kla History tablosuna i\u015flenmektedir. \u00d6ncelikle g\u00fcncellenen verinin fiziksel tabloda\u00a0&#8220;StartDate&#8221; kolonuna o anki zaman ve tarih de\u011feri girilirken, &#8220;EndDate&#8221; kolonuna ise &#8220;datetime2&#8221; de\u011ferinin alabilece\u011fi en son de\u011fer girilir. History tablosunda ise, &#8220;StartDate&#8221; kolonu ilgili verinin al\u0131nan en son kayd\u0131n\u0131n &#8220;EndDate&#8221; kolonundaki veriyle g\u00fcncellenmektedir. &#8220;EndDate&#8221; kolonu ise o anki zaman ve tarih de\u011ferleriyle g\u00fcncellenmektedir.History tablosundaki sonraki g\u00fcncelleme i\u015flemlerini a\u015fa\u011f\u0131daki \u015femada somut bir \u015fekilde g\u00f6rebilirsiniz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4942 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"557\" height=\"244\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables.png 557w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-300x131.png 300w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/a><\/li>\n<\/ul>\n<p>Temporal Tables \u00f6zelli\u011fi ile verilerimizi kolayl\u0131kla takip edebilmekteyiz. Tabi ki de bu i\u015flemleri uygulamal\u0131 bir \u015fekilde pratik olarak ele alaca\u011f\u0131z. Ama daha o ad\u0131ma gelmeden\u00a0Temporal Tables \u00f6zelli\u011fini kullanabilmemiz i\u00e7in nelere dikkat etmemiz, hangi \u015fartlar\u0131 g\u00f6zetmemiz gerekti\u011fine bir g\u00f6z atal\u0131m.<\/p>\n<ul>\n<li>Temporal Tables ile raporlama ve takip mekanizmas\u0131 olu\u015fturaca\u011f\u0131m\u0131z tablolarda Primary Key tan\u0131mlanm\u0131\u015f bir kolon olmas\u0131 gerekmektedir. Bu \u015fekilde ya\u015fam d\u00f6ng\u00fcs\u00fcnde hangi verinin de\u011fi\u015fime u\u011frad\u0131\u011f\u0131n\u0131 bu Primary Key arac\u0131l\u0131\u011f\u0131yla ay\u0131rt edebilece\u011fiz.<\/li>\n<li>Makalemizde de de\u011findi\u011fimiz gibi takibini sa\u011flayaca\u011f\u0131m\u0131z ve kayd\u0131n\u0131 tutaca\u011f\u0131m\u0131z tablomuzun i\u00e7erisinde bir ba\u015flang\u0131\u00e7 birde biti\u015f niteli\u011finde iki adet &#8220;datetime2&#8221; tipinden kolonlar\u0131n bulunmas\u0131 gerekmektedir.<\/li>\n<li>Linked Server \u00fczerinde\u00a0Temporal Tables kullan\u0131lmamaktad\u0131r.<\/li>\n<li>History tablomuzda <a href=\"http:\/\/www.gencayyildiz.com\/blog\/transact-sql-constraintlerkisitlayicilar\/\" target=\"_blank\">constraint<\/a> yap\u0131lar\u0131n\u0131n hi\u00e7birini uygulayamay\u0131z.<\/li>\n<li>Herhangi bir verinin de\u011fi\u015fiklik periodunu tutmas\u0131 amac\u0131yla olu\u015fturmu\u015f oldu\u011fumuz &#8220;datetime2&#8221; tipinden kolonlar \u00fczerinde manuel de\u011fi\u015fiklikler yapmam\u0131z gerekmektedir.<\/li>\n<li>E\u011fer bir tabloda\u00a0Temporal Tables aktifse o tabloda Truncate i\u015flemi ger\u00e7ekle\u015ftiremiyoruz.<\/li>\n<li>History tablosunda direkt olarak DML i\u015flemleri ger\u00e7ekle\u015ftiremiyoruz.<\/li>\n<li>Temporal Tables \u00f6zelli\u011finin bulundu\u011fu bir tabloda <a href=\"http:\/\/www.gencayyildiz.com\/blog\/sql-serverda-computed-columnshesaplanmis-kolon-olusturma\/\" target=\"_blank\">Computed Column(Hesaplanm\u0131\u015f Kolon)<\/a> tan\u0131mlayam\u0131yoruz.<\/li>\n<\/ul>\n<p>\u0130\u015fte Temporal Tables \u00f6zelli\u011fini teorik olarak burada noktal\u0131yoruzzz&#8230;<\/p>\n<p>\u015eimdi s\u0131ra bu anlatt\u0131klar\u0131m\u0131z \u00e7er\u00e7evesinde pratik uygulamalar geli\u015ftirmeye geldi.<\/p>\n<p>\u00d6ncelikle bir\u00a0Temporal Tables olu\u015fturmay\u0131 g\u00f6relim.<\/p>\n<h3>Temporal Tables Olu\u015fturma<\/h3>\n<p>Temporal Tables olu\u015fturmak bildi\u011fimiz tablo olu\u015fturma y\u00f6ntemiyle ayn\u0131d\u0131r.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nCREATE TABLE DersKayitlari\r\n(\r\n\t----------1. K\u0131s\u0131m----------\r\n\tDersID INT PRIMARY KEY IDENTITY(1,1),\r\n\tDers NVARCHAR(MAX),\r\n\tOnay BIT,\r\n\t----------1. K\u0131s\u0131m----------\r\n\t----------2. K\u0131s\u0131m----------\r\n\tStartDate DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,\r\n\tEndDate DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,\r\n\t----------2. K\u0131s\u0131m----------\r\n\t----------3. K\u0131s\u0131m----------\r\n\tPERIOD FOR SYSTEM_TIME(StartDate, EndDate)\r\n\t----------3. K\u0131s\u0131m----------\r\n)\r\n----------4. K\u0131s\u0131m----------\r\nWITH(SYSTEM_VERSIONING = ON)\r\n----------4. K\u0131s\u0131m----------\r\n<\/pre>\n<p>\u015eimdi yukar\u0131da neler yapm\u0131\u015f olduk inceleyelim.<\/p>\n<ul>\n<li><strong><em>1. K\u0131s\u0131m<\/em><\/strong><br \/>\nTablomuzda bulunacak olan normal kolonlar\u0131m\u0131z\u0131 olu\u015fturuyoruz.<\/li>\n<li><strong><em>2. K\u0131s\u0131m<\/em><\/strong><br \/>\nTemporal Tables&#8217;da verilerin izlenme periyodunu tutmam\u0131z\u0131 sa\u011flayacak olan, makalemizin i\u00e7eri\u011finde olduk\u00e7a vurgulad\u0131\u011f\u0131m\u0131z &#8220;StartDate&#8221; ve &#8220;EndDate&#8221; kolonlar\u0131m\u0131z\u0131 olu\u015fturuyoruz. Bu kolonlara dikkat ederseniz e\u011fer ikiside &#8220;datetime2&#8221; veri tipindendir. Ayr\u0131ca &#8220;GENERATED ALWAYS AS ROW START&#8221; ve &#8220;GENERATED ALWAYS AS ROW END&#8221; komutlar\u0131ylada i\u015faretlenerek, History tablosunda hangi kolon ba\u015flang\u0131\u00e7 hangi kolon biti\u015f zaman\u0131n\u0131 tutaca\u011f\u0131n\u0131 belirtmi\u015f oluyoruz.<\/li>\n<li><strong><em>3. K\u0131s\u0131m<\/em><\/strong><br \/>\nPERIOD FOR SYSTEM_TIME komutu ile &#8220;StartDate&#8221; ve &#8220;EndDate&#8221; kolonlar\u0131n\u0131n takip s\u00fcrecinde periyodik i\u015flevde kolonlar oldu\u011funu belirtiyoruz. Yani bu i\u015flemden sonra ilgili kolonlar Temporal Table i\u015flemlerine \u00f6zel i\u015faretlenmi\u015f oluyorlar.<\/li>\n<li><strong><em>4. K\u0131s\u0131m<\/em><\/strong><br \/>\nWITH(SYSTEM_VERSIONING = ON) komutu ile art\u0131k olu\u015fturaca\u011f\u0131m\u0131z bu tablonun System-Versioned Table \u00f6zelli\u011fini aktifle\u015ftirmi\u015f oluyor, anlayaca\u011f\u0131n\u0131z tablomuzu Temporal Table olarak ayarlam\u0131\u015f oluyoruz.<\/li>\n<\/ul>\n<p>Bu \u015fekilde T-SQL komutlar\u0131m\u0131z\u0131 Execute ederek sorgumuzu i\u015fleyelim. Alaca\u011f\u0131m\u0131z sonuc a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4960 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-2.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"373\" height=\"460\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-2.png 373w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-2-243x300.png 243w\" sizes=\"auto, (max-width: 373px) 100vw, 373px\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;DersKayitlari&#8221; isimli tablomuz olu\u015fturulmu\u015f i\u00e7erisine de &#8220;MSSQL_TemporalHistoryFor_402100473&#8221; isimli bir History tablosu eklenmi\u015ftir. &#8220;DersKayitlari&#8221; tablosu ile History tablomuzun kolonlar\u0131 raporlama ve takip s\u00fcrecini net bir \u015fekilde ger\u00e7ekle\u015ftirebilmemiz i\u00e7in bire bir ayn\u0131d\u0131r. Tek fark History de Primary Key kolonu yoktur.<\/p>\n<p>Ayriyetten biliyorum ki, sizlerde benim gibi History tablosunun isminden rahats\u0131z olmu\u015fsunuzdur. Biz &#8220;DersKayitlari&#8221; tablomuzu Temporal tablo olarak ayarlarken olu\u015fturulacak History tablosuna bir isim vermedi\u011fimiz i\u00e7in sistem rastgele isimlendirme yapm\u0131\u015ft\u0131r. E\u011fer ki, History tablosunun ismini belirlemek istiyorsan\u0131z a\u015fa\u011f\u0131daki gibi WITH(SYSTEM_VERSIONING = ON) komutuna HISTORY_TABLE ile ekleme yap\u0131n\u0131z.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nCREATE TABLE DersKayitlari\r\n(\r\n\tDersID INT PRIMARY KEY IDENTITY(1,1),\r\n\tDers NVARCHAR(MAX),\r\n\tOnay BIT,\r\n\r\n\tStartDate DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,\r\n\tEndDate DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,\r\n\r\n\tPERIOD FOR SYSTEM_TIME(StartDate, EndDate)\r\n)\r\nWITH(SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DersKayitlariLog))\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4967\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-3.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"240\" height=\"56\" \/><\/a><\/p>\n<p>\u015eauana kadar yeni olu\u015fturulan bir tabloyu Temporal tablo olarak ayarlamay\u0131 g\u00f6rd\u00fck. \u015eimdi ise \u00f6nceden olu\u015fturulmu\u015f bir tabloyu Temporal olarak ayarlamay\u0131 g\u00f6relim.<\/p>\n<h3>Var Olan Tabloyu Temporal Tables Olarak Ayarlama<\/h3>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nCREATE TABLE DersKayitlari\r\n(\r\n\tDersID INT PRIMARY KEY IDENTITY(1,1),\r\n\tDers NVARCHAR(MAX),\r\n\tOnay BIT\r\n)\r\n<\/pre>\n<p>Varsayal\u0131m ki elimizde &#8220;DersKayitlari&#8221; tablomuz en sade \u015fekilde olsun.<\/p>\n<p>E\u011fer bu tabloyu Temporal yapmak istiyorsak bir duruma dikkat etmeliyiz. Tablo i\u00e7erisinde veri var m\u0131? yok mu? E\u011fer varsa yeni eklenecek olan &#8220;StartDate&#8221; ve &#8220;EndDate&#8221; kolonlar\u0131na bo\u015f kalamayacaklar\u0131 i\u00e7in varsay\u0131lan de\u011ferlerin belirtilmesi gerekecektir. Yok e\u011fer veri yoksa bu i\u015flemi d\u00fc\u015f\u00fcnmemize gerek olmayacakt\u0131r.<\/p>\n<p>\u00d6ncelikle tablomuz i\u00e7erisinde veri olmad\u0131\u011f\u0131n\u0131 varsayal\u0131m.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nALTER TABLE DersKayitlari\r\nADD\r\nStartDate DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,\r\nEndDate DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,\r\nPERIOD FOR SYSTEM_TIME (StartDate, EndDate)\r\n<\/pre>\n<p>Bu \u015fekilde \u00e7al\u0131\u015farak periyodik kolonlar\u0131m\u0131z\u0131 ekleyebiliriz.<\/p>\n<p>Veri oldu\u011funu varsayarsak e\u011fer,<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nALTER TABLE DersKayitlari\r\nADD \r\nStartDate DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL\r\nDEFAULT CAST('1900-01-01 00:00:00.0000000' AS DATETIME2),\r\nEndDate DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL\r\nDEFAULT CAST('9999-12-31 23:59:59.9999999' AS DATETIME2),\r\nPERIOD FOR SYSTEM_TIME (StartDate,EndDate)\r\n<\/pre>\n<p>\u015feklinde \u00e7al\u0131\u015farak Default constraint arac\u0131l\u0131\u011f\u0131yla eklenecek kolonlar\u0131m\u0131za varsay\u0131lan de\u011ferleri girilmelidir.<\/p>\n<p>Velhas\u0131l hangi \u015fekilde olursa olsun kolonlar eklendikten sonra Temporal tablo \u00f6zelli\u011fi aktifle\u015ftirilmelidir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nALTER TABLE DersKayitlari\r\nSET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DersKayitlariLog))\r\n<\/pre>\n<p>Evet&#8230;<\/p>\n<p>Bu i\u015flemden sonra elimizdeki kolonumuz Temporal olarak de\u011fi\u015ftirilmi\u015f olacakt\u0131r.<\/p>\n<p>\u015eimdi s\u0131ra Temporal tablomuzun \u00e7al\u0131\u015fma mekanizmas\u0131n\u0131 denemeye geldi.<\/p>\n<h3>\u00c7al\u0131\u015fma Mekanizmas\u0131<\/h3>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4970 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-4.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"488\" height=\"287\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-4.png 488w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-4-300x176.png 300w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/a><br \/>\nEkran al\u0131nt\u0131s\u0131ndan g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi tablolar\u0131m\u0131z\u0131 sorgulad\u0131\u011f\u0131m\u0131zda i\u00e7erikleri resimdeki gibi gelmektedir.<br \/>\n\u015eimdi a\u015fa\u011f\u0131daki sorgular\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nUpdate DersKayitlari Set Ders = 'Matematik2' where DersID = 1\r\nUpdate DersKayitlari Set Ders = 'Fizik2' where DersID = 2\r\nUpdate DersKayitlari Set Ders = 'Kimya2' where DersID = 3\r\nUpdate DersKayitlari Set Ders = 'Kimya3' where DersID = 3\r\nUpdate DersKayitlari Set Ders = 'Biyoloji2' where DersID = 4\r\nUpdate DersKayitlari Set Ders = 'Biyoloji3' where DersID = 4\r\n<\/pre>\n<p>Sorgular\u0131m\u0131z\u0131 g\u00f6nderdikten sonra alaca\u011f\u0131m\u0131z neticeyi a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnden inceleyiniz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4973 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-5.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"489\" height=\"343\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-5.png 489w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-5-300x210.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><\/a><br \/>\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi verilerimizde yap\u0131lan de\u011fi\u015fiklikler ad\u0131m ad\u0131m History tablosuna aktar\u0131lmakta, raporland\u0131r\u0131lmakta ve takip mekanizmas\u0131 s\u0131k\u0131nt\u0131s\u0131z \u00e7al\u0131\u015fmaktad\u0131r.<\/p>\n<p>\u015eimdi ise History tablomuzda bir g\u00fcncelleme ger\u00e7ekle\u015ftirelim.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-6.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4978\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-6-300x60.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"300\" height=\"60\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-6-300x60.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-6.png 573w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi herhangi bir Temporal tablonun History tablosu i\u00e7erisinde g\u00fcncelleme vs. gibi i\u015flemler ger\u00e7ekle\u015ftirememekteyiz. E\u011fer History tablosu i\u00e7erisinde g\u00fcncelleme yapmak i\u00e7in Temporal \u00f6zelli\u011fini a\u015fa\u011f\u0131daki gibi pasifize etmeliyiz&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nALTER TABLE DersKayitlari SET ( SYSTEM_VERSIONING = OFF )\r\n<\/pre>\n<p>Bu sorguyu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra History tablosu \u00fczerinde rahat\u00e7a i\u015flem ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>\u015eimdide s\u0131ra Temporal tablo i\u00e7erisinde History tablosuna \u00f6zel bir filtreleme i\u015flemi ger\u00e7ekle\u015ftirmeye geldi.<\/p>\n<h3>History Tablosuna \u00d6zel Temporal Tabloyu Sorgulama<\/h3>\n<p>E\u011fer ki Temporal tabloyu, History tablosundaki periyotlara g\u00f6re sorgulamak istiyorsak a\u015fa\u011f\u0131daki gibi bir sorgu kullanabiliriz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSelect * from DersKayitlari dk inner join DersKayitlariLog dkl on dk.DersID = dkl.DersID where DAY(dkl.StartDate) &amp;gt;= DAY(CAST('Tarih' as datetime2)) or  DAY(dkl.EndDate) &amp;lt;= DAY(CAST('2016-09-26 06:23:45.8195851' as datetime2)) \r\n<\/pre>\n<p>Tabi ki de sorgulamay\u0131 bu \u015fekilde tercih edebilece\u011fimiz gibi Temporal tablolara \u00f6zel olarak gelen parametreler arac\u0131l\u0131\u011f\u0131yla, tablomuzu History tablosunun periyoduna \u00f6zel bir \u015fekilde rahat\u00e7a sorgulatabilmekteyiz.<\/p>\n<p>\u015eimdi bu parametreleri a\u015fa\u011f\u0131daki sorgular neticesinde gelen veriler \u00fczerinde inceleyelim&#8230;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4984\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-7-300x169.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"300\" height=\"169\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-7-300x169.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-7.png 494w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><em><strong>Parametre<\/strong><\/em><\/td>\n<td style=\"text-align: center;\"><span style=\"color: #0000ff;\"><strong><em>AS OF&lt;datetime&gt;<\/em><\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td><em><strong>Mant\u0131ksal Sorgusu<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nStartDate &gt;= datetime and EndDate &lt; datetime\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><em><strong>\u00d6rnek<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSELECT * FROM DersKayitlari\r\nFOR SYSTEM_TIME AS OF '2016-09-26 06:22:53.5432528'\r\nWHERE DersID = 3\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4987 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-8.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"482\" height=\"52\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-8.png 482w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-8-300x32.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td><em><strong>A\u00e7\u0131klama<\/strong><\/em><\/td>\n<td>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi verilen tarihi History tablosundaki StartDate ve EndDate aral\u0131\u011f\u0131nda aramakta ve ilgili verinin zamansal de\u011fi\u015fimi elde edilmektedir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><em><strong>Parametre<\/strong><\/em><\/td>\n<td style=\"text-align: center;\"><span style=\"color: #0000ff;\"><strong><em>FROM &lt;start_datetime&gt; TO &lt;end_datetime&gt;<\/em><\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td><em><strong>Mant\u0131ksal Sorgusu<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nstart_datetime &gt;= datetime and end_datetime &lt; datetime\r\n<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td><em><strong>\u00d6rnek<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSELECT * FROM DersKayitlari\r\nFOR SYSTEM_TIME FROM '2016-09-26 06:23:45.7982247' TO '2016-09-26 07:47:49.4820110'\r\nWHERE DersID = 3\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-9.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4992\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-9-300x39.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"300\" height=\"39\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-9-300x39.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-9.png 489w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td><em><strong>A\u00e7\u0131klama<\/strong><\/em><\/td>\n<td>Verilen tarih aral\u0131\u011f\u0131nda ilgili verinin zamansal de\u011fi\u015fimlerini g\u00f6rebiliyoruz.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><em><strong>Parametre<\/strong><\/em><\/td>\n<td style=\"text-align: center;\"><span style=\"color: #0000ff;\"><strong><em>BETWEEN &lt;start_datetime&gt; AND &lt;end_datetime&gt;<\/em><\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td><em><strong>Mant\u0131ksal Sorgusu<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nstart_datetime &gt;= datetime and end_datetime &lt; datetime\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><em><strong>Parametre<\/strong><\/em><\/td>\n<td style=\"text-align: center;\"><span style=\"color: #0000ff;\"><strong><em>CONTAINED IN(start_datetime, end_datetime<\/em><\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td><em><strong>Mant\u0131ksal Sorgusu<\/strong><\/em><\/td>\n<td>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nstart_datetime &gt;= datetime and end_datetime &lt; datetime\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u015eimdi ise databaseimizde bulunan Temporal tablolara nas\u0131l eri\u015febilece\u011fimizi inceleyelim.<\/p>\n<h3>Temporal Tablolar\u0131 Listelemek<\/h3>\n<p>A\u015fa\u011f\u0131daki vermi\u015f oldu\u011fum sorgularla sistemimizdeki Temporal tablolar\u0131 listeletebiliriz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSELECT\r\nNAME, OBJECT_ID, TEMPORAL_TYPE_DESC, HISTORY_TABLE_ID, OBJECT_NAME(HISTORY_TABLE_ID) as\r\n&#x5B;History Tablo Ad\u0131]\r\nFROM SYS.TABLES WHERE OBJECT_NAME(HISTORY_TABLE_ID) IS NOT NULL\r\n<\/pre>\n<p>ya da<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSELECT\r\nNAME, OBJECT_ID, TEMPORAL_TYPE_DESC, HISTORY_TABLE_ID, OBJECT_NAME(HISTORY_TABLE_ID) as\r\n&#x5B;History Tablo Ad\u0131]\r\nFROM SYS.TABLES WHERE TEMPORAL_TYPE_DESC = 'SYSTEM_VERSIONED_TEMPORAL_TABLE'\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-10-300x60.png\" alt=\"SQL Server 2016 \u2013 Temporal Tables\" width=\"300\" height=\"60\" class=\"aligncenter size-medium wp-image-5000\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-10-300x60.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/09\/SQL-Server-2016-\u2013-Temporal-Tables-10.png 644w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Evet, benim i\u00e7in uzun ve zahmetli bir yaz\u0131 oldu&#8230;<br \/>\nSizin i\u00e7in okumas\u0131 zevkli, bol katk\u0131l\u0131 ve faydal\u0131 bir i\u00e7erik olaca\u011f\u0131n\u0131 umuyorum.<\/p>\n<p>Sonraki yaz\u0131lar\u0131m\u0131zda g\u00f6r\u00fc\u015fmek \u00fczere diliyorum&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Kan\u0131mca Yaz\u0131l\u0131m Uzman\u0131 olman\u0131n temel ve olmazsa olmaz \u015fartlar\u0131ndan biriside do\u011fru bir raporlama ve takip mekanizmas\u0131 olu\u015fturmaktan ge\u00e7mektedir. Takip s\u00fcrecini kontrol edecek olan bu mekanizma, hem detayl\u0131 raporlama hem de projenin ya\u015fam d\u00f6ng\u00fcs\u00fcnde&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3415,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1412],"tags":[854,1438,1443,1442,1428,110,1445,1444,1423,1424,501,1440,1439,1434,1429,1436,1413,1437,1421,1441,350,1422],"class_list":["post-4927","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sql-server-2016","tag-always","tag-as-of","tag-between","tag-between-and","tag-computed-column","tag-constraint","tag-contained","tag-contained-in","tag-data-manipulation-language","tag-datetime2","tag-dml","tag-from","tag-from-to","tag-generated","tag-hesaplanmis-kolon","tag-history_table","tag-sql-server-2016","tag-system_versioning","tag-temporal-tables","tag-to","tag-trigger","tag-zamansal-tablolar"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4927"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4927\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3415"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}