From 48385e2c88c046b8847a512a5015b6464cc30e38 Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 20 Dec 2023 09:34:55 +0000 Subject: [PATCH] Deployed 41c5e49 with MkDocs version: 1.5.3 --- .../vscode/egenskaper.png" | Bin 0 -> 6341 bytes .../vscode/endre_navn.png" | Bin 0 -> 4279 bytes .../vscode/index.html" | 47 ++++++++++++++---- .../vscode/lag_snarvei.png" | Bin 0 -> 23797 bytes .../vscode/lag_snarvei1.png" | Bin 0 -> 21371 bytes "Installasjon-p\303\245-VDI/vscode/maal.png" | Bin 0 -> 28945 bytes search/search_index.json | 2 +- sitemap.xml | 42 ++++++++-------- sitemap.xml.gz | Bin 455 -> 455 bytes 9 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 "Installasjon-p\303\245-VDI/vscode/egenskaper.png" create mode 100644 "Installasjon-p\303\245-VDI/vscode/endre_navn.png" create mode 100644 "Installasjon-p\303\245-VDI/vscode/lag_snarvei.png" create mode 100644 "Installasjon-p\303\245-VDI/vscode/lag_snarvei1.png" create mode 100644 "Installasjon-p\303\245-VDI/vscode/maal.png" diff --git "a/Installasjon-p\303\245-VDI/vscode/egenskaper.png" "b/Installasjon-p\303\245-VDI/vscode/egenskaper.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c06072cea64174b641dd9be3254f1ca29cb0470 GIT binary patch literal 6341 zcma)AbyQSsw?C9LA{|m9EsR4-BPa;MfOLbjL&Lz(Lkbd#FDXceAf+G;k~4rfbPgp* zrwrY9-tWENjdlOIXRQ;@TF-g*UcbHfZ^s)Qh#Dms3mE_alnz3{ws)s%tCfx8>H1)<|(t;YcH^&R=;OCsEw)Z>|nHvmv|{e9#0xR=-g0F$Zu zlgIjgmOFFg9(q3CiT@-Oz8XCwqKm8>(q$JC3FjZfjBJK(ckmi!)|YmD$? z6N!Cyw7V40D)*!nw)Zgh0oJ%<&iN^kQR$>1^%v{76t(j&QHPJsFvb3SYs=RIXF0_i zV^~*hQXqb5eN~SHDakLqW;bSYxTMZgMul)JXK$d8zx2;`M1k&`=Ij?CMj#2gQiN zyL=uZue4o_F1~-oCQSt@CaDpehACf@5+E=3+Hz7-csKwht6ntPqS31;2x!eqM&O?o z78c$Y5O@`1cYS$gSe6pNtCjI2(4P>P?Mwv!k|q0#=Xq+-@wB56kAQ%HLybR9s^egG zQL9|9Gwk))m_7p}+Z7}C3MC*=XC6#HVTkK5Q8Bpgk-B~+*tA2z-;H8suf;fJ~g){f=ET?6(Y8XB9geEY2* zCa0z8J=e3Mj+N>q2W1UtMzbUo|Cc0vsE(nkZy zvYY3tr9~+ba=yVAP{rrle06=X=g3`EvE^T)g(TydZSeeEQfYJBN8Y<$n-D;#phDj* zEiF0i9b`%rb#_LPmwx8dE7r`@RSC&WEAa~0C`#jB{9INhCMH(;scL`%kfOq2m|u^j z7cv}bmQEq}G6Ko}X(zDKDB*%1Wm{H#I#(|nPfbaor>Fl4@m)aR~E~4DS~PoN9v3yc);Zf(8~Gd(*>s8z%n3 zBO&W$%6VCd`{$B~nE(K;!yBu^Q1V8Set)cSYAZNHq51NwKZ0J%{OiDfw#4HB0OEhk z|5boOp-xZzo@V0QL_Z`KG}O1(@cZr3lFba57OSeTl*h<3px(V zdpHmuG2a{srnqDWi8+GWAp-*{O~H-!{i$D7ByRz3RCW}nl|@A>mCd`@AgLTN$AS6Q zKnoEg7Z(>FABlv#0c0HG+S;1l+FLeR-yIAxyJU2uWNj!9X`+NpZ{xPQ{d473s?FchijaCzcg>+s)YSB1 z@87@gca5(<`@p=xW31%Gq@VNz=`ZS?PIAncBOTitXY(PcNq5EdZhF;x> z4$ybiiTHd^(nvKL=b1PLN?~Ut*lt|QE;vX>uQH1{e1S-P_QMg4$xLP%L1-ocGp(Ov zh}_;v9rTQQa&9^47Ct=#pLVufz#)Gv9EaTMkCLR3aI}d9W6Fa}DfjOli}A#{v@j|bum}%n+ zr}+sffWyEBxO8Gr6Wo8Kb`%-BCkh6>@;^j@?fnf&@P_gpgUxTBnKA z8puU-9HlE^7XyASt0yf-P<6vzjyeS%@6saxrJT+qrUg!0{L*)##q!ooP*;huiHS{E z5zY*}H73-AXL#>>yk#VBytiZ*-w#85(%o;AXjCaCCnpS&>3;M89%Z_Hid@t*?m2hi zGea05N*ru*;@qyMe-^P}&mgba@m05rbUYtrQAMlJ)6nFNtE#E>^qT3Lam&cWUc>$j zwzzk4=XZ)Pa&78x)XliDI*6OGeqI5=@IuWPHq(`wzRIY^CuX~gC2@S2VPl9Zs;wP& zk(AAXY}iV$WsmMtEa4sfw5k?`_I`PoFj0@-gvWDuLySUJw^XoTVD@t&I1EO>%pLvs z_A;>(Fb{EMB=Z0QOZ$@bAeJTgcxuKSD~TC)n| zVBJ>SoY7WDe24eTFe;w(K8L8oNR|x>7QLioC!Wy;y56tb|6MyAfh?iscz>_ZH8P!T zTL&7WD0}>ja{o?U%|Yh}#P-F-Vh}NiJ&*uL#uTEwiRU7=%W#B7R9w>thlWP+&+N&P zwx7*}VVg8*amRGjdwU^iVN_$pH@9AO4`P zPZV!fzxCPJR(VVre%kpV{aMNnMii??irD{&X7V=nr`=emp zw1_cb+Vs#;a614raM^~N1~z>O<*IOaJ~gz+TZS&yua_Z;P?ZP_`#Ew0Y~Z=bmU}S!xOO3T@Jof0*JY_d-Ib?;l~R z@8i4TZ&(-Vq<0w1B6+u=78Yg0f;ntJu2dqpBSyFABJ}IDfDNJAvyx#qF##0{2xFP8 zu>dWrY;Ue^8$2)XTi-`&_P^w%=Qo!@`c_5J6u$FL-Xjjx(wg7uWzdqJMjaB~l1Qx! zW&BL%CjhK)T0#PwU}Q|2Wff&LvTP2l?lg3_F#K{KD;f9<1e3uwU-L&I$4Ni8eROVs zuDQRXvJm6RUOQvR9Cd-?5PBBa93h#6-u+_A-P!3vS$l-$J);MJ032&4Hx-iKY1ZgR z7*a9MLu)eWxypU_XZc?_=|x7a?{oH(XvfKh9K?Az{a3j;}AE| zG%E=M@r=8Y&O%ilOW}&ZDH$_uPyiW|S5YI9-8<6{nN2H(ViPNW9QY$eMyQJPHag}V z)eFHxhaSE)=#gsRtE8f8r0E>g_2D#yLo;$yXKLqt#+TQr3MaJI&9g(Yotxr{15q(P!%E3<_ZEx{XWQz%|Zeb>(6$NF+omM&} zJ|-DqTVh?q8=}aMNh(kQwH;1%{f@-II**;E&KC6}s_0R!22*-y4SK$_G#+9U*Ja>H z8zLzSV##{ygQ~tY8aw>LOjlKtDSysb|Dt<1R;Da2F5V8W;LlWv8uz1n-1iz@LnFqy z+5kWagmX}%!1ga&H$Fz2MA3d73;Z5OR8NbhO`tIS^t-@hZ}Xoo;1{=@=EKd0imTc3 z&Bm6)EYjUh^;TXbpMSm$V0HH*qq6*x{=k&yMDYY!gn}L$i3^|hOq=Y#aM#v8uOdc$ z4?$p?y?JM)^lj^9SIAUjnFXC~^uyJ41ku8(VhVS0g_|;pFpKKIHapExM9REkyqm>^ zih$9E@lkYK4Y^2W!)<)$L+Xl*M&P$nhm zQ-bJgNr^p@VW)W2r0JOERJ?Y$F|Al)kTLDSz?(L^ol3@=1~Prd99 za`#MyuWPHRZDc(cQq{3mjj{zz&XN4|pdc$oQiD*_s?JOAs zh4l`_w$r5`*WYU@d%=qKiIS1mrm_fiQQ6|Vo>)j}#GSy6Jj80SRxJejV=O)WF&7ut zFw4=$DkxvtYL?=aig(!u$|H7Mk`T6^~~HON#a;nF4doyoZJ$z)PYfOmW|7}&$ql&IOms?l$4PXlyMl! zol%wZM_qbMJF30SN+CYF^|uuBgWLGZGY=-FBGZMn9aWw5MfRJ!mlMvBXQF9kkLe}M zU$$XtP^ep}%5#8l0H{Hxf}^5|Sn4 zneP(ZDAvdZBPkF@XjuX;r6o+VhVD;MU>z8w=IuxpT~inb4J_qA?lPXvZZ1=;fpD09 z;qIrJMXuO~Q3uhyYU%r*N#Vi-?Fk*`CY=7#M#pPwAvvkpt1y}8AgK!fEujLWttTTR z95!Q9YkD>PDd#%c=bIthJy4G(qL72kkl?FG;||Tu#0b3VBd&eJ#luMzOo#xEI!xG!@(0-mtuzT=faM`q=R=mHP4Me9R$u&1_8qn%-Fo}yp3KHn{q_^b9z(9NM+kcuQLOfq|+qjE6u0;$8 zF~NKs1J~?nU7x7!IcExO=~VfdbPqk;*qCI#1^i;Q)1=PT$qP1jS&rc{O^f5mq!#1z zd0S_{cwAr@Rq&$qW@K1_yI^!Iw=KIo^;H?CU?5z zY-T)2smpJW5!2h7&XvbfF+2XeVfFUEW0BEFxCs07$q^Z7x7(p7YaBZF{e_znJ5le+#9$Z8BuoqVziQ0x!{mW_J{og+EfA*<K-!Ff#Qf?k|(aD4X8i_c3`l0CEa<;nBXooL;i>QLDZ z`$Cj@E6o{K{S%p&BhmenYwBuZ*#f5(*ZbSFH5jWX`TJB`LrE=8dv)bczIMqMx7KW0 zyN!1y|B%@75|mS8xCU>bxkr?wf^N|QOk?1y_IR~a%YnXLQ^?GDi|tm87gBNJV$n!oPPG^)B-H7B7!(jr3N`#`YKs;sLPN@f*Y;6GlZ2dpjFh z8J`np=ZG3zkqITdiftNh$M^T_9&fhRAPvvs-#6~*M#2J8mdAcZc3L2g9%*|i-!n?@ zfu_Y0G()<15>jQ3MnUdVeWbDqDHKS<|JSIfh%i*dUNWXs1fo^PZJrZI`%F z)c4p-nFypdHlMy!S4$;})I?h&i_XYPm?xo|ju|j#6fNdRbnNooGw;RzGM*=W#S2xD zNjo`_H=lq6z$}yvq#HF) zh|SB*X3Iw{f0xv~>FvsF1ONeRWzYW^u%zeywsfAp9VZfZBBjV(K?MLq#ED>n_`!~( z^sJg@&MfB(T<@mDp@ahTQj%KbY=5htkpQ_MT%q>_o8LMTy?LTA;i>*%c=x)yZm<+~ zwcMsZ`}5CT^}^1ln;UT}{Q%Gu7EekxC-OymDfK!vkmtF1Y>rujjBMk<3BKRDc=aeF zS#JaYoHK~>GQpbLzn3@+vJy{a{J`p7%5REdF;@J)N-H8ecW|2Fs;n?B&-nU<#SzJo zi=ykI_qs@LvB^((p!3Ma>sj)dr0lmlcPzTbt-T&BiAbsI5#|=zK}Qv zUz-ivDcS;9^lXjS4Aent2w#0#;N*EH2P6;yxO^q zMok}E!_c1^6^}twfx%s@M2+s-=zZg27nB&0bR0^r-~gMJT{a8=hb%Y<+01fkxfETw zqr!T;QazumWzjhf)-mvk1VvgDN>{(Hu>YW!*wo(YVX{;N7poeOBD^_CocYnLHoxfJ#zk+QP!B3UgejPq2we1RiTFFsm3)F)F_1i4AgA zs_PNWkT^RV*|ZaXaAav%{*y@{*i#7?z84{40Y5OMZwgv0`j~-SKHTiU(DPSHgv72_ zVa>4_f#mjZe=z&o*1(6^u_^oSgrCWUC|^REU*rV|;kjnDtxy2DlYe7`%CCD<)ot?1 z(;!WxCSqW={#MM^SxqGs?Cev+H??d{XES)CvK3MbiHo^IE?mO-G0OLqxnefqIcQA| zGy3DwAF!w&qR@0P7OvI~>oX zoLz4+DV;9}fQbJ&B5bTyvhlXZcC?2#iUORttdJl7-i+YR-^Ty{UTz|9FA$wV4@AcT S`*7|90P0U6Pb!tI!~X+M{_Q~k literal 0 HcmV?d00001 diff --git "a/Installasjon-p\303\245-VDI/vscode/endre_navn.png" "b/Installasjon-p\303\245-VDI/vscode/endre_navn.png" new file mode 100644 index 0000000000000000000000000000000000000000..314ac08aa588a833d054dc48607024723df9507c GIT binary patch literal 4279 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 literal 0 HcmV?d00001 diff --git "a/Installasjon-p\303\245-VDI/vscode/index.html" "b/Installasjon-p\303\245-VDI/vscode/index.html" index cded76a..61a4f99 100644 --- "a/Installasjon-p\303\245-VDI/vscode/index.html" +++ "b/Installasjon-p\303\245-VDI/vscode/index.html" @@ -634,6 +634,15 @@ + + +
  • + + + Oracle oppsett for Preview query + + +
  • @@ -1313,6 +1322,15 @@ + + +
  • + + + Oracle oppsett for Preview query + + +
  • @@ -1375,23 +1393,32 @@

    Installasjon og oppsettInstalleres via VS Code Marketplace, følg installasjonsrutinene til Altimate

    Utover standardinstallasjon må følgende hensyn tas for bruk på VDI Utvikler og mot Oracle DVH:

    dbt Power User krever at man setter opp miljøvariabler med credentials via PowerShell, før VS Code startes opp i samme PowerShell-sesjon.

    -

    Eksempel på hvordan man kan sette opp miljøvariabler i forkant via PowerShell:

    +

    Det finnes et skript start_vscode_dbt.ps1 i dette repoet som setter opp miljøvariable, oppretter ptyhon miljø hvis det ikke finnes fra før, og starter Visual Studtio Code som forenkler denne prosessen.

    +

    Skriptet er generelt og krever at stien til et gyldig dbt-prosjekt settes som argument i tillegg til schemanavnet dbt skal bruke som proxy. F.eks.:

    +
    start_vscode_dbt.ps1 c:\sti\til\dbt-prosjekt\ skjemanavn
    +
    +

    (Her må \c:\sti\til\dbt-prosjekt\ peke på mappen som inneholder dbt_project.yml)

    +

    Ideen er at man kan legge skriptet et sted på utviklerimage, f.eks. c:\datavarehus\start_vscode_dbt.ps1, og lage snarveier på skrivebordet til hvert av prosjektene, slik at miljøet for hvert prosjekt kan startes opp med et dobbeltklikk.

    +

    For slikt oppsett, gjør følgende:

      -
    1. Lukk eventuelle eksisterende sesjoner av VS Code
    2. -

      Start PowerShell i dbt-mappen i aktuelt dbt-prosjekt. Trykk på dbt-mappen, hold deretter inne Shift-tasten og høyreklikk på mappen. Velg Åpne PowerShell-vindu her (eller tilsvarende tekst på engelsk om du er litt mer internasjonal)

      -

      Åpne mappe i Powershell

      +

      Høyreklikk - hold - dra over skrivebordet - slipp. Velg Lag snarveier her.

      +

      Lag snarvei

      +
    3. +
    4. +

      Høyreklikk på den nye snarveien og velg Egenskaper

      +

      Høyreklikk

    5. -

      Kjør .\setup_dbt_env.ps1 + enter i PowerShell-vinduet som åpnet seg (skriv setup + trykk på TAB for auto-complete)

      -

      Kjør .\setup_dbt_env

      +

      Fyll inn følgende tekst i Mål: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -ExecutionPolicy Bypass -File "C:\datavarehus\start_vscode_dbt.ps1" c:\sti\til\dbt-prosjekt\ skjemanavn

      +

      Mål

    6. -

      Start VS Code fra samme PowerShell-vindu som .\setup_dbt_env.ps1 ble kjørt i, code . + enter

      -

      Start VS Code

      +

      Endre navn på snarvei til noe mer passende:

      +

      Endre navn

    -

    (Espen jobber med et PowerShell script som skal gjøre denne operasjonen enklere)

    +
    Oracle oppsett for Preview query

    Preview query-template må endres for Oracle-bruk:
    1. Åpne Settings ved å trykke CTRL + , 2. Søk etter dbt.queryTemplate @@ -1421,7 +1448,7 @@

    Erfaringer - December 19, 2023 + December 20, 2023 diff --git "a/Installasjon-p\303\245-VDI/vscode/lag_snarvei.png" "b/Installasjon-p\303\245-VDI/vscode/lag_snarvei.png" new file mode 100644 index 0000000000000000000000000000000000000000..37e17e36cdc80b95e6fc71330ef23c03a4dec44f GIT binary patch literal 23797 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�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 Qs+>kw%Sf|I{o#xM1CV}g$^ZZW literal 0 HcmV?d00001 diff --git "a/Installasjon-p\303\245-VDI/vscode/lag_snarvei1.png" "b/Installasjon-p\303\245-VDI/vscode/lag_snarvei1.png" new file mode 100644 index 0000000000000000000000000000000000000000..422cc7b5bb138fd278b3201fdac6f0409e05a045 GIT binary patch literal 21371 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

    ;U-GI#r$NU5QOL0~of zFW^x;T|n5}{)F@Wesxk(;1#zYF1puWUp7U8OJICsq@9ocC4|kHKSvv|H)j#uKG`7s zOndoop}Fjo&T0%v@47sleVzfg;l^`qR5;p)5*YIFvZKyXC9asK7Z@w0`+1ds zW3lq-(#Bb_WKfLeTU0fhB*G&^%A%AzT&A%$3v>V-CJNqF51YR=RQTWys+%}oAOpg{ z&fn#KBJpR{EpsDE&=x@A0J?lNB|U_-OO3^XD6F}f4X~CFHVPaF{(ul@wXF~YYJXwP z|7`-$zXRQId?k3{|Btoj|IP>Ze<%3AMg0HuLDG2>6(!f}(gW1FH24q#7;aiE+dr8@ zR_2oa!99Wm^UII`8MrGBw)y(+jvL3&gRSgs3XWgp!tM8~fO4vv2LUB9@PET)!7w#T zNPd}3cQ9Ei`IhsLh3^Vxb0NV@2ppPl{D8Pc=UsKttsOU}_vck;cO0q8Ipp!&3Xs4( zY(APV&iL|W=%FQb>!LfCJ5|#pR5l6lrGUQR2Y|D+LUV@xK-Mt%EJlKUAY{fMa5*f_ zl%-uzK0>s|q(JnJPdvM{mK{O=BstU_=gkG;3Q2#~+%{L0^}LqJ>_VA;5uvs*qi0tD zjO>pnVYC$@}} zj)22^%MDBlpq@O;#CD7=)$iA7ht~&QLUu&qx`0oQ4HEsg+${9tB^u+I@}D{EXKI^ANHS?H&2-xMf4GBIg_sdD0=v(K1{cz{DF}00^JY6 z`llhjjSdx;FFVA;_{&@+w}Mj|*J*3|FprMI>$kgha!62Ejy#*|6BOWo`nx$wN1<@3a3oW-f87gSg&e3NIJ{`Dz0^{gB@xd{y zf3Toz0H$=mGnj^AeL5~7b=s%VUm8UcHcxBfe^hDAzX5z@A*ER-awdJtUqv`ZCcSd~ z4+*iUkRTdR(;@&RmL6Ydxf1;HhM<}fK-doF_A-RMw6z`F3^CE0~pWByofbp_9rO^v$m+J`2! z#sTCKyFr(>j}JNqRn1d1jGMMjLg?mqyGuGQnfOm#akH$w2|o(m+lXj{o5)LBsX~H4 zKhy(EAo|DXvdYGfvBq-iwVU;~i>jNG1j{X+ZViC}c!y;(JO))B`jIRf6LL&joZd;K zO0_zs-?@^lDxfK@xqEyTf_-XZCagv6csgV`(Zilkt`xcsz12~pF>I8+2!99l)JxDe zPt8ZwXgGabuk?Sr6$LGc{p$Gi=IkJEH>a-QMIbg})q4aW&d^*~Drv$|nJRii#=2q3 z(<)+VE|D}fO6g}=YPq0SXW$VzG@6xUzWD`p_acn$i%6N9!!N+&q?%pToRh3pu-a)s z{4%e-y!>46^LoiWZzjj*jJk70wcSqUmBBAX{GQORx01}2h{Tt?C3-&6Sv#A5ak$)L zkz2&|NVH~n>cc+m@pBnxM4B^FqvhVwLHdYs=4Tt>z-&qg1ndFO3OBo)w(Wf4pfR;U zT^93<>-yvb|66;LH5%xojC<^+If#(g;Qk0(e}<@zf(v4&-oEHk{jtHh57!ntoqY6| znPsMy$FEe-Fvv65=!a=&<<{vPo&;Le6zLaDFj44V=Ze!QH;8Yot%?&H0pke*rBQWj z-EJZ9RaUwj&>;thu-3N5KuH<2K~v>>T8-`9qwh&-NbRy z7VHK=OwyOO#! z(sTkl7A$c!?guUjD)AaV(0ky2Z8rJ!T{t6YjgGVxv-RW)!&i^%TNn4w{;bn9yaRGa ze#O~Zktbh$0i4k5As*!BO<(~6gOQqDPutwboD5F1x5Gjg2I_6~g^Z3DX;(%q!>5W) zUG;~lzFk3Zw6(WqTK@@~2k9af%($3>%9P`#AWnHtJ0jtkq*~osqdbt (data build tool) er et SQL basert transformasjonsvekt\u00f8y som lar deg modularisere og skrive testbar SQL kode. dbt s\u00f8rger for at SQLene blir kj\u00f8rt i riktig rekkef\u00f8lge slik at sluttproduktet blir oppdatert korrekt.

    En SQL fil i dbt blir kalt en modell i dbt. Modeller kan materialiseres p\u00e5 ulike m\u00e5ter. Som view, tabell eller rett og slett en SQL snutt som kan gjenbrukes i flere modeller etter DRY-prinsippet.

    dbt er IKKE et extract-load verkt\u00f8y. Det betyr at dataene som skal transformeres allerede m\u00e5 ligge i databasen dbt er koblet til. dbt krever alts\u00e5 at data er lastet p\u00e5 forh\u00e5nd, med feks en pythonjobb eller kafkakonsument. Dataene trenger ikke n\u00f8dvendigvis ligge i samme komponentskjema eller samme BigQuery prosjekt. S\u00e5 lenge dataene er tilgjengelig p\u00e5 samme database og dbt service brukeren har tilgang til \u00e5 lese dataene er du good to go.

    dbt kommer b\u00e5de i som open source i form av dbt-core og i en egen cloud versjon, dbt cloud. Cloud versjonen st\u00f8tter kun skydatabaser som feks. BigQuery og Snowflake. dbt Cloud kan derfor ikke brukes mot Oracle onprem databasen til datavarehus. For datasett som befinner seg p\u00e5 datamarkedsplassen i BigQuery, kan dbt Cloud v\u00e6re en mulighet.

    For Oracle on-prem benytter vi dbt-oracle som er en python pakke som baserer seg p\u00e5 dbt-core. Oracle er ikke offisielt st\u00f8ttet av dbt, men Oracle har tatt ansvar for community connectoren og og blir aktiv vedlikeholdt og fortl\u00f8pende oppdatert til siste versjon av dbt-core. For \u00e5 n\u00e5 on-prem Oracle m\u00e5 vi som kjent benytte utviklerimage. Denne guiden tar for seg installasjon og oppsett av dbt-oracle p\u00e5 vdi utvikler gjennom Visual Studio Code.

    "},{"location":"#lenker","title":"Lenker","text":"

    F\u00f8r du g\u00e5r gjennom detaljene p\u00e5 hvordan dbt b\u00f8r settes opp er det lurt \u00e5 bli kjent med hvordan dbt fungerer. Nedenfor er det et knippe nyttige lenker som hjelper deg med \u00e5 komme igang og l\u00e6re de viktigste kommandoene og funksjonene i dbt.

    "},{"location":"#kurs-dbt-fundamentals","title":"Kurs - dbt fundamentals","text":"

    Det er sterkt anbefalt \u00e5 starte med \u00e5 g\u00e5 gjennom fundamentals kurset til dbt labs. Dette kurset bruker dbt cloud, men mesteparten av innholdet kan overf\u00f8res til dbt-core. Bruk gjerne GCP dev milj\u00f8et til teamet for \u00e5 sette opp testprosjektet i BigQuery, men husk p\u00e5 \u00e5 slette ressursene i etterkant

    "},{"location":"#designprinsipper","title":"Designprinsipper","text":"

    How to design a dbt model from scratch. Hvordan b\u00f8r du tenke n\u00e5 du designer nye modeller med dbt? Det er fort gjort \u00e5 bomme p\u00e5 f\u00f8rste fors\u00f8k, og det koster mye tid.

    "},{"location":"#dimensjonsmodellering","title":"Dimensjonsmodellering","text":"

    Kimball er fortsatt relevant med dbt. Building a Kimball dimensional model with dbt

    "},{"location":"#bok","title":"Bok","text":"

    Det er nylig (juni 2023) lansert en bok om Data Engineering with dbt. Boken inneholder instroduksjon til data engineering generelt og endelt om ulike skydatabaser i tillegg til grunnleggende bruk av dbt. Kanskje den mest interessante delen er kapittel 8 som omhandler testing med dbt.

    "},{"location":"#nyttige-lenker","title":"Nyttige lenker","text":"

    dbt's egne guider: Lessons

    Community basert samling av lenker: awsome-dbt

    "},{"location":"#hvorfor-skal-jeg-bruke-dbt-jeg-kan-jo-kjre-sql-med-python","title":"Hvorfor skal jeg bruke dbt? Jeg kan jo kj\u00f8re SQL med Python","text":"

    Det er riktig. Dersom du bare skal kj\u00f8re noen enkle SQL sp\u00f8rringer er det kanskje like greit \u00e5 sette opp en Pythonjobb som kj\u00f8rer SQLen for deg. Men med en gang antall sp\u00f8rringer eller kompleksiteten p\u00e5 sp\u00f8rringene \u00f8ker vil dbt hjelpe med med \u00e5 strukturere koden og holde oversikt over rekkef\u00f8lgen. Det er ikke uvanlig at en komponent best\u00e5r av 30 eller flere SQL filer som avhenger av hverandre.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/","title":"DBT","text":"

    Det finnes en offisiell oracle adapter for dbt v1.x. Gjerne start med \u00e5 ta en titt p\u00e5 denne installasjonsguiden f\u00f8rst.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#installasjon","title":"Installasjon","text":"

    dbt kan installeres sammen med oracle adapteren med kommandoen:

    pip install dbt-oracle\n

    Nedlasting feiler

    $ pip install dbt-oracle\nWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)'))': /simple/dbt-oracle/\n\n...\n\nCould not fetch URL https://pypi.org/simple/dbt-oracle/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/dbt-oracle/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)')))\n

    Sjekk om du har gjort oppsett av sertifikater til pip.

    Installasjon feiler

    I noen tilfeller har vi opplevd at Microsoft Visual C++ mangler. Feilmeldingen kan se slik ut:

    ...\nBuilding wheels for collected packages: cx-Oracle\nBuilding wheel for cx-Oracle (pyproject.toml) ... error\nerror: subprocess-exited-with-error\n\n\u00d7 Building wheel for cx-Oracle (pyproject.toml) did not run successfully.\n\u2502 exit code: 1\n\u2570\u2500> [8 lines of output]\n      C:\\Users\\RA_S167159\\AppData\\Local\\Temp\\pip-build-env-lh09agh5\\overlay\\Lib\\site-packages\\setuptools\\config\\expand.py:144: UserWarning: File 'C:\\\\Users\\\\RA_S167159\\\\AppData\\\\Local\\\\Temp\\\\pip-install-ki6mcccg\\\\cx-oracle_5a1e160a6cb5498187fe05d5b5637d8c\\\\README.md' cannot be found\n        warnings.warn(f\"File {path!r} cannot be found\")\n    pip_system_certs: ERROR: could not register module: No module named 'wrapt'\n    running bdist_wheel\n    running build\n    running build_ext\n    building 'cx_Oracle' extension\n    error: Microsoft Visual C++ 14.0 or greater is required. Get it with \"Microsoft C++ Build Tools\": https://visualstudio.microsoft.com/visual-cpp-build-tools/\n    [end of output]\n\nnote: This error originates from a subprocess, and is likely not a problem with pip.\nERROR: Failed building wheel for cx-Oracle\nFailed to build cx-Oracle\nERROR: Could not build wheels for cx-Oracle, which is required to install pyproject.toml-based projects\n...\n
    Last ned og installer Build Tools. F\u00f8lg gjerne guiden her: Fixed: Microsoft Visual C++ 14.0 Is Required Error Husk \u00e5 restarte VDI etter installasjon.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#opprette-nytt-dbt-prosjekt-for-oracle","title":"Opprette nytt dbt prosjekt for Oracle","text":"

    Oppsettet av nytt prosjekt er forenklet og tilpasset datavarehus. Det er laget eksempelprosjekt i repo dvh_template for bruk av dbt til komponentskjemaer. dbt prosjektet ligger i en egen branch dbt_template.

    • For nye komponenter er det bare \u00e5 opprette nytt github repo med utgangspunkt i dbt-template.
    • For eksisterende komponentrepoer, ta en kopi av dbt og lim inn i roten til komponentrepoet.

    Hvis du ikke \u00f8nsker \u00e5 ta i bruk standardprosjektet, men heller kj\u00f8re dbt init er det noen ting som kan skape uforst\u00e5elige feilmeldinger:

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#quoting","title":"Quoting","text":"

    Quoting av databasenavn m\u00e5 aktiveres i dbt_project.yml siden databasenenavnene til dvh-databasene er med sm\u00e5 bokstaver (eks. dwhu1). Hvis ikke dette gj\u00f8res kommer det feilmeling som sier noe slikt som approximate match

    For \u00e5 skru p\u00e5 quoting m\u00e5 f\u00f8lgende settes i dbt_project.yml:

    quoting:\n  database: true\n
    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#hemmeligheter-ved-kjring-fra-utviklerimage","title":"Hemmeligheter ved kj\u00f8ring fra utviklerimage","text":"

    Av sikkerhetshensyn anbefaler vi og oracle \u00e5 bruke milj\u00f8variabler for \u00e5 holde p\u00e5 hemmeligheter. Vi har derfor laget et script og profiles.yml som kan ligge i dbt-prosjektet.

    Scriptet kan lastes ned fra navikt/dvh_template/dbt/setup_db_user.ps1.

    profiles.yml skal opprettes i p\u00e5 toppniv\u00e5 i dbt-prosjektmappen, eksempel navikt/dvh_template/dbt/profiles.yml Merk at navn p\u00e5 profil er profilnavnet det henvises til i dbt_project.yml

    <navn p\u00e5 profil>:\n  target: \"{{env_var('DBT_DB_TARGET')}}\"\n ...\n

    N\u00e5r profilen er p\u00e5 plass i prosjektmappen kan du teste at dbt fungerer.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#teste-dbt-installasjonen","title":"Teste dbt installasjonen","text":"

    Etter at dbt er p\u00e5 plass kan du verifisere at dbt fungerer ved \u00e5 kj\u00f8re .\\setup_db_user.ps1 etterfulgt av dbt debug fra prosjektmappen. Er det et nytt prosjekt m\u00e5 du opprette profiles.yml f\u00f8rst.

    .\\setup_db_user.ps1 m\u00e5 kj\u00f8res hver gang en starter en ny terminal eller \u00f8nsker \u00e5 bytte target (db). Scriptet vill midlertidlig opprette milj\u00f8variablene i terminal-sesjonen for target, brukernavn, passord, schema og peke dbt mot profiles.yml i prosjektmappen.

    Success

    $ .\\setup_db_user.ps1\nTarget db: U <eventuelt Q,R eller P>\nSchema: \n\ncmdlet Get-Credential at command pipeline position 1\nSupply values for the following parameters:\nCredential\n\n$ dbt debug\n09:15:08  Running with dbt=1.1.1\ndbt version: 1.1.1\npython version: 3.8.10\npython path: c:\\users\\****\\appdata\\local\\programs\\python\\python38\\python.exe      \nos info: Windows-10-10.0.19044-SP0\nUsing profiles.yml file at C:\\Users\\****\\git\\dvh-sykefravar-dmx\\profiles.yml\nUsing dbt_project.yml file at C:\\Users\\****\\git\\dvh-sykefravar-dmx\\dbt_project.yml\n\n09:15:08  oracle adapter: Running in cx mode\nConfiguration:\n  profiles.yml file [OK found and valid]   \n  dbt_project.yml file [OK found and valid]\n\nRequired dependencies:\n- git [OK found]\n\nConnection:\n  user: ****\n  database: dwhu1\n  schema: ****\n  protocol: tcp\n  host: dm07-scan.adeo.no\n  port: 1521\n  tns_name: None\n  service: dwhu1\n  connection_string: None\n  shardingkey: []\n  supershardingkey: []\n  cclass: None\n  purity: None\n  Connection test: [OK connection ok]\n\nAll checks passed!\n

    DBT er n\u00e5 klart til bruk.

    Error

    Connection test: [ERROR]\n\n2 checks failed:\nError from git --help: Could not find command, ensure it is in the user's PATH and that the user has permissions to run it: \"git\"\n\ndbt was unable to connect to the specified database.\nThe database returned the following error:\n\n  >Database Error\n  DPI-1047: Cannot locate a 64-bit Oracle Client library: \"failed to get message for Windows Error 126\". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help\n\nCheck your database credentials and try again. For more information, visit:\nhttps://docs.getdbt.com/docs/configure-your-profile\n

    Oracle client library er mest sannsynlig ikke installert.

    "},{"location":"Installasjon-p%C3%A5-VDI/git/","title":"GIT","text":"
    1. Installering av GIT - har du den allerede er det flott.
    2. Denne finner du p\u00e5 felles disken under programvare. programvare\\git. Installer f.eks Git-2.30.2-64-bit. Legg installasjon directory inn i milj\u00f8variabel PATH. F.eks C:\\Users\\<brukernavn>\\AppData\\Local\\GitHubDesktop\\bin
    3. Dette steget er sannsynligvis ikke n\u00f8dvendig, og utf\u00f8res kun om det oppst\u00e5r problemer i senere steg. Oppdatere milj\u00f8variabler slik at utviklingsimaget kan kommunisere med Github. Dette er beskrevet i https://confluence.adeo.no/pages/viewpage.action?pageId=272519832 punkt 10c
    4. F\u00f8lgende legges inn som milj\u00f8 variabler
    5. https_proxy til http://webproxy-utvikler.nav.no:8088
    6. http_proxy: http://155.55.60.117:8088/
    7. no_proxy: localhost,127.0.0.1,*.adeo.no,.local,.adeo.no,.nav.no,.aetat.no,.devillo.no,.oera.no,devel
    8. Opprett et PAT (personal access token) som du m\u00e5 bruke som passord ved autentisering. Se https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token Alternativt kan du bruke GitHub Dekstop som setter dette opp for deg automatisk.
    9. Clone repositoriet du skal jobbe med. Husk \u00e5 bruke PAT opprettet i punkt 3. som passord om du ikke bruker GitHub Desktop.
    "},{"location":"Installasjon-p%C3%A5-VDI/installere/","title":"Installere DBT p\u00e5 VDI","text":""},{"location":"Installasjon-p%C3%A5-VDI/installere/#forutsetninger","title":"Forutsetninger","text":"

    For \u00e5 installere dbt m\u00e5 du ha f\u00f8lgende installert:

    • Python 3.10.x
    • PIP og oppsett av dbt-milj\u00f8
    • GIT / GitHub Desktop
    • Oracle client library
    "},{"location":"Installasjon-p%C3%A5-VDI/installere/#anbefalinger","title":"Anbefalinger","text":"

    For en god utvikleropplevelse anbefaler vi deg \u00e5 ha f\u00f8lgende installert:

    • Visual studio code eller en annen tekst editor
    • SQLFluff
    "},{"location":"Installasjon-p%C3%A5-VDI/miljovariabler/","title":"Legge til milj\u00f8variabler","text":"
    1. S\u00f8k etter milj\u00f8variabler
    2. Klikk p\u00e5: Rediger milj\u00f8bariabler for kontoen din
    1. Trykk p\u00e5 Ny...
    2. Gi variabelen et navn i Variabelnavn.
    3. Skriv inn path til programmet i Variabelverdi
    4. Trykk OK
    1. Marker Path variabelen
    2. Trykk Rediger...
    1. Trykk Ny
    2. Skriv inn navnet p\u00e5 variabelen du opprettet med syntaksen %<variabelnavn>% eks: %PIP%
    3. Trykk OK
    1. Trykk OK

    Note

    Husk at du m\u00e5 lukke cmd (ledetekst) og \u00e5pne p\u00e5 nytt for at endringen skal tre i kraft.

    "},{"location":"Installasjon-p%C3%A5-VDI/oracle-client-library/","title":"Oracle client library","text":"

    Note

    Dette steget utg\u00e5r hvis du bruker thin mode (tynnklient som ikke trenger klientbiblioteket. Introdusert i dbt-oracle 1.1.1). Det anbefales \u00e5 bruke thin mode, da kj\u00f8ring av kode g\u00e5r en del raskere.

    Dette finnes p\u00e5 fellesdisken og mappen programvare\\oracle\\ og kan kopieres lokalt. Det er er instantclient-basiclite-windows som benyttes.

    Oppdater PATH milj\u00f8variabelen med path til oracle client library. Eksmpel:

    C:\\data\\instantclient-basiclite-windows\\instantclient_19_11\n

    Note

    Se legg til milj\u00f8variabler hvis du ikke vet hvordan du oppdatere PATH.

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/","title":"PIP og oppsett av python med dbt","text":"

    Vi har laget et ferdig oppsett av et dbt prosjekt tilpasset NAV dvh. Enten lag et nytt repo basert p\u00e5 dvh_template eller amd_template avhengig av preferanse for komponentoppsett p\u00e5 github. Deretter m\u00e5 dbt_template merges inn for \u00e5 f\u00e5 integrert dbt prosjektet.

    F\u00f8lgende script (ogs\u00e5 p\u00e5 github) installerer et virtuelt python milj\u00f8 kun for dette prosjektet.

    pip --version\n

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/#feilsk-sjekk-om-du-har-pip","title":"Feils\u00f8k: Sjekk om du har PIP","text":"

    Har du installert python, s\u00e5 har du nesten sikkert ogs\u00e5 pip. Men dersom overst\u00e5ende feiler, kj\u00f8r pip --version for \u00e5 se om pip er tilgjengelig:

    pip --version\n

    Success

    pip --version\n\npip 21.1.1 from c:\\users\\*****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\pip (python 3.8)\n

    Fortsett til \"Sett opp config fil for pip\"

    Failure

    pip --version\n\n'pip' is not recognized as an internal or external command, operable program or batch file.\n

    Kj\u00f8r py -3 -m ensurepip for \u00e5 se om pip allerede eksisterer.

    Looking in links: c:\\Users\\****\\AppData\\Local\\Temp\\tmp4r6s0n91\nRequirement already satisfied: setuptools in c:\\users\\****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages (58.1.0)\nRequirement already satisfied: pip in c:\\users\\****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages (21.2.4)\n

    I dette tilfelle m\u00e5 milj\u00f8variabelen PATH oppdateres. Bruk gjerne Fil utforsker for \u00e5 finne riktig path men normalt ligger PIP under:

    c:\\users\\<brukernavn>\\appdata\\local\\programs\\python\\python38\\scripts\n

    Info

    Se legg til milj\u00f8variabler hvis du ikke vet hvordan du oppdatere PATH.

    Husk at du m\u00e5 lukke og \u00e5pne cmd (ledetekst) etter path variabel er lagt inn. Du kan n\u00e5 verifisere at pip er tilgjengelig ved \u00e5 kj\u00f8re pip --version.

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/#oppsett-av-sertifikater-til-pip","title":"Oppsett av sertifikater til pip","text":"

    Note

    Dette steget skjer automatisk under kj\u00f8ring av setup_python_env.ps1 og er ikke lenger n\u00f8dvendig.

    Til vanlig bruker pip sitt eget sertifikat for \u00e5 validere at vi laster ned pakker fra riktig server. Siden VDI bruker en webproxy for \u00e5 kommunisere med omverdenen vill vi f\u00e5 en feilmeling ved pip install xxx.

    Error

    13:42:24  Encountered an error: External connection exception occurred:\nHTTPSConnectionPool(host='hub.getdbt.com', port=443): Max retries exceeded\nwith url: /api/v1/index.json (Caused by SSLError(SSLCertVerificationError(1,\n'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get\nlocal issuer certificate (_ssl.c:1108)')))\n

    For \u00e5 fikse feilen kan vi installere pakkene setuptools-scm og pip-system-certs som f\u00e5r pip til \u00e5 bruke Windows Certificate Store istedenfor.

    pip install setuptools-scm pip-system-certs --trusted-host pypi.org --trusted-host  files.pythonhosted.org\n
    "},{"location":"Installasjon-p%C3%A5-VDI/python/","title":"Python","text":"

    Sjekk om Python er installert med py --version. dbt-versjon 1.4 og senere st\u00f8tter Python-versjon 3.11, for en tidligere dbt-versjon m\u00e5 Python-versjon v\u00e6re >= 3.8 og < 3.11.

    Last eventuelt ned python 3.10.x og installer ved \u00e5 f\u00f8lge installsjonsveiviseren.

    py --version\n

    Success

    $ py --version\n\nPython 3.8.10\n

    Fortsett til PIP

    Failure

    $ py --version\n\nPython 3.6.4\n
    For gammel version av Python

    Last ned Python

    Failure

    $ py --version\n\npython is not recognized as an internal or external command, operable program, or batch file\n

    Python er ikke installert

    Last ned Python

    "},{"location":"Installasjon-p%C3%A5-VDI/sqlfluff/","title":"SQLFluff","text":"

    SQLFluff er en linter som hjelper oss med \u00e5 formattere SQL-koden p\u00e5 en fornuftig m\u00e5te.

    "},{"location":"Installasjon-p%C3%A5-VDI/sqlfluff/#installering-av-sqlfluff","title":"Installering av SQLFluff","text":"
    pip install sqlfluff sqlfluff-templater-dbt\n
    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/","title":"Visual Studio Code","text":"

    Bruk https://code.visualstudio.com/download, velg Windows versjonen. Last ned, pakk ut og start programmet code. F\u00f8lg instruksjonene ved innstalleringen.

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#anbefalte-extensions","title":"Anbefalte extensions","text":""},{"location":"Installasjon-p%C3%A5-VDI/vscode/#dbt-power-user","title":"dbt Power User","text":"

    dbt Power User gir oss en rekke nyttige verkt\u00f8y, som f.eks.:

    • Lekker lineage vist i VS Code
    • Auto-complete dbt code
    • SQL validator
    • Preview query results
    • En rekke snarveier, blant annet via egne knapper
    • Visning av generert SQL-kode (slipper \u00e5 lete den frem i target-mappen)

    dbt Power User p\u00e5 GitHub

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#installasjon-og-oppsett","title":"Installasjon og oppsett","text":"

    Installeres via VS Code Marketplace, f\u00f8lg installasjonsrutinene til Altimate

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#utover-standardinstallasjon-ma-flgende-hensyn-tas-for-bruk-pa-vdi-utvikler-og-mot-oracle-dvh","title":"Utover standardinstallasjon m\u00e5 f\u00f8lgende hensyn tas for bruk p\u00e5 VDI Utvikler og mot Oracle DVH:","text":"

    dbt Power User krever at man setter opp milj\u00f8variabler med credentials via PowerShell, f\u00f8r VS Code startes opp i samme PowerShell-sesjon.

    Eksempel p\u00e5 hvordan man kan sette opp milj\u00f8variabler i forkant via PowerShell:

    1. Lukk eventuelle eksisterende sesjoner av VS Code
    2. Start PowerShell i dbt-mappen i aktuelt dbt-prosjekt. Trykk p\u00e5 dbt-mappen, hold deretter inne Shift-tasten og h\u00f8yreklikk p\u00e5 mappen. Velg \u00c5pne PowerShell-vindu her (eller tilsvarende tekst p\u00e5 engelsk om du er litt mer internasjonal)

    3. Kj\u00f8r .\\setup_dbt_env.ps1 + enter i PowerShell-vinduet som \u00e5pnet seg (skriv setup + trykk p\u00e5 TAB for auto-complete)

    4. Start VS Code fra samme PowerShell-vindu som .\\setup_dbt_env.ps1 ble kj\u00f8rt i, code . + enter

    (Espen jobber med et PowerShell script som skal gj\u00f8re denne operasjonen enklere)

    Preview query-template m\u00e5 endres for Oracle-bruk: 1. \u00c5pne Settings ved \u00e5 trykke CTRL + , 2. S\u00f8k etter dbt.queryTemplate 3. Endre skript til select * from ({query}) where ROWNUM <= {limit}

    Ref.: #dbtquerytemplate-for-oracle

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#erfaringer-feil-som-har-oppstatt-ved-bruk-av-dbt-power-user","title":"Erfaringer - feil som har oppst\u00e5tt ved bruk av dbt Power User:","text":"
    • Hele dbt-prosjektet blir validert n\u00e5r prosjekt-mappen \u00e5pnes. Eventuelle initielle imports som er lagt inn i dbt_run.py, som f.eks. from google.cloud import secretmanager, vil gi feil i VDI Utvikler. Begrens initielle imports til grunnleggende behov.
    "},{"location":"arkitektur/style_guide/","title":"DBT Stil Guide","text":"

    forket fra https://github.com/dbt-labs/corp/blob/main/dbt_style_guide.md

    "},{"location":"arkitektur/style_guide/#modell-naming","title":"Modell Naming","text":"

    V\u00e5r modellere organiserers inn i tre hovedgrupper: staging, marts, base/intermediate. See f\u00f8lgnede diskusjon. The navngiving blir som f\u00f8lger:

    \u251c\u2500\u2500 dbt_project.yml\n\u2514\u2500\u2500 models\n    \u251c\u2500\u2500 marts\n    |   \u2514\u2500\u2500 core\n    |       \u251c\u2500\u2500 mellomlager\n    |       |   \u251c\u2500\u2500 mellomlager.yml\n    |       |   \u251c\u2500\u2500 posteringer__unionisert.sql\n    |       |   \u2514\u2500\u2500 posteringer__gruppert.sql\n    |       \u251c\u2500\u2500 core.docs\n    |       \u251c\u2500\u2500 dim_artskonti\n    |           \u251c\u2500\u2500 dim_artskonti.yml\n    |           \u2514\u2500\u2500 dim_artskonti.sql\n    |       \u251c\u2500\u2500 dim_konstnadssteder\n    |           \u251c\u2500\u2500 dim_konstnadssteder.yml\n    |           \u2514\u2500\u2500 dim_konstnadssteder.sql\n    |       \u2514\u2500\u2500 fak_hovedbok_posteringer\n    |           \u251c\u2500\u2500 fak_hovedbok_posteringer.yml\n    |           \u2514\u2500\u2500 fak_hovedbok_posteringer.sql\n    \u2514\u2500\u2500 staging\n        \u2514\u2500\u2500 oebs\n            \u251c\u2500\u2500 base\n            |   \u251c\u2500\u2500 base.yml\n            |   \u2514\u2500\u2500 base__oebs_kontoplan.sql\n            \u251c\u2500\u2500 src_oebs.yml\n            \u251c\u2500\u2500 src_oebs.docs\n            \u251c\u2500\u2500 stg_oebs__posteringerslinjer\n            |   \u251c\u2500\u2500 stg_oebs__posteringerslinjer.yml\n            |   \u2514\u2500\u2500 stg_oebs__posteringerslinjer.sql\n            \u251c\u2500\u2500 stg_oebs__budjsett_balanser\n            |   \u251c\u2500\u2500 stg_oebs__budjsett_balanser.yml\n            |   \u2514\u2500\u2500 stg_oebs__budjsett_balanser.sql\n
    - All objekter oppgis p\u00e5 flertallsform, slik som: stg_oebs__hovedbok_posteringslinjer, stg_oebs__artskonti, etc. - Basetabeller prefikses med base__, slik som: base__<source>_<object> - Mellomlagringstabeller skal avsluttes med et fortidsverb som indikerer hvilken handling som er gjort p\u00e5 objektet, slik som: hovedbok_posteringslinjer__filtrert_budsjett - Datatorg, eller marter, er fordelt mellom faktaer (uforandelig, verb) og dimensjoner (foranderlig, subjekt) og prefikses med fak_ og dim_, henholdvis. - Staged strukter inneholder alle kolonner fra r\u00e5-tabellen og utvides med avledede kolonner, for \u00e5 angi naturlig n\u00f8kler, hashed n\u00f8kler, omd\u00f8ping av kolonnenavn, etc.

    "},{"location":"arkitektur/style_guide/#model-konfigurasjon","title":"Model konfigurasjon","text":"
    • Model-spesifike attributer (som sort/dist keys) skal spesifiseres i modellen.
    • Hvis en spesifikk konfigurasjon som gjelder alle modeller i en folder, burde dette spesifiseres i dbt_project.yml.
    • Modell konfigurationer skal spesifiseres slik:

    {{\n  config(\n    materialized = 'table',\n    sort = 'id',\n    dist = 'id'\n  )\n}}\n
    - Marter b\u00f8r alltid configureres som tabeller - med mindre det er sv\u00e6rt gode grunner til \u00e5 ikke gj\u00f8re det.

    "},{"location":"arkitektur/style_guide/#dbt-konvensjoner","title":"DBT konvensjoner","text":"
    • Kun stg_og base_ sp\u00f8r mot sourceer.
    • Alle andre ref andre modeller.
    "},{"location":"arkitektur/style_guide/#tester","title":"Tester","text":"
    • Hver underfolder inneholder en .yml fil som tester alle modeller i folderen. Navnestandarden skal v\u00e6re <folder-navn>.yml.
    • Som et minimum, skal unique og not_null v\u00e6re testet p\u00e5 prim\u00e6r n\u00f8kkeler
    "},{"location":"arkitektur/style_guide/#navngivining-og-felt-konvensjoner","title":"Navngivining og felt konvensjoner","text":"
    • Skjema, tabell og kolonne nanv skal v\u00e6re snake_case.
    • Bruk navn basert p\u00e5 business terminologien, i stedet for kilde terminology.
    • Hver model skal ha en prim\u00e6r n\u00f8kkel.
    • Prim\u00e6r n\u00f8kkeler i modellen navngis som pk_<objekt>, alts\u00e5 pk_dim_person.
    • Fremmed n\u00f8kkeler angis som fk_<objekt>, tidsl\u00f8se enhets n\u00f8kkeler angis som ek_<objekt> og naturlige n\u00f8kkeler angis som lk_<objekt>.
    • For base og stage modeller skal felter v\u00e6re ordnet inne kategorier, fra identifikatorer til tidsstempler tilslutt.
    • Tidsstempel kolonner skal v\u00e6ver navngitt som <hendelse>_ts, e.g. lastet_ts, og skal v\u00e6re p\u00e5 UTC. for avvikende tidszoner skal tidzonen indikeres ved suffiks, e.g lastet_ts_pt.
    • Boolean verdier og skal oppgis mot er_ eller har_ og uttrykkes med 1 for Ja og 0 for Nei.
    • Bel\u00f8ps kolonner skal ha suffiks _nokfor, flyttalls, bel\u00f8p i kroner, og _orer for heltall bel\u00f8p i \u00f8rer.
    • S\u00e6r norske bokstaver som \u00c6, \u00d8, \u00c5 skal angis som ae, o og a.
    • Unng\u00e5r reservert word som kolonne navn.
    • Bruk samme feltnavn gjennom alle modellene hvor mulig, e.g. n\u00f8kkelen til dim_person skal v\u00e6re pk_dim_personog ikke pk_bruker.
    "},{"location":"arkitektur/style_guide/#cteer","title":"CTEer","text":"

    For mer informasjon om hvorfor vi bruker CTEer, see f\u00f8lgende post. Kortversjonen er at det hjelper oss \u00e5 samle kildene \u00f8verst, gj\u00f8re enkle transformasjoner og joiner i midten og se resultatet nederst. Oracle skal st\u00f8tte passthrough slik at masse wither p\u00e5 rad ikke p\u00e5virker ytelsen.

    • Alle {{ ref('...') }} settning skal plasseres i en egen CTE, ved toppen av fila.
    • Hvor det er mulig, skal en CTE gj\u00f8re en og kun en logisk mengde arbeid.
    • CTE navn skal v\u00e6re ordrike og beskrive hva denne faktisk gj\u00f8r.
    • CTE er med forvirrende eller avansert logik skal kommenteres like etter at den er definert.
      with\n\nhendelser_vask as (\n\n    -- Kommentarer\n    -- mer kommentarer\n    ...\n)\n
      ),
    • CTEer som gjenbrukes i feller modeller skal tas ut og bli egne modeller.
    • Modeller b\u00f8r avsluttest med en endelig CTE som selekterer hele det endelig produktet f\u00f8r modelen avslutted SELECT * FROM endelig.
    • CTEene skal formatere som f\u00f8lger:
    WITH\n\nhendelser AS (\n\n    ...\n\n),\n\n-- CTE comments go here\nfiltrerte_hendelser AS (\n\n    ...\n\n),\n\nendelig AS (\n\n    SELECT * FROM filtrerte_hendelser\n\n),\n\n\nSELECT * FROM endelig\n
    "},{"location":"arkitektur/style_guide/#sql-stil-guide","title":"SQL stil guide","text":"
    • Sett komma p\u00e5 slutten setningen
    • Bruke fire mellom rom for \u00e5 indentere koden, uten om ved predikatet, som skal v\u00e6re p\u00e5 linje med WHERE
    • Ingen linjer skal v\u00e6re lenger enn 80 tegn
    • All felt navn skal v\u00e6re skrevet med sm\u00e5 bokstaver, og alle funksjonsnavn (SELECT, WHERE, LEAD, etc.) med STORE.
    • Bruk alltid ASfor \u00e5 aliase tabeller og felt.
    • Alle felt skal angis f\u00f8r alle aggregater og vindu funskjoner.
    • Aggregering skal skal l\u00f8ses s\u00e5 tidlig som mulig, f\u00f8r en joiner med andre tabeller.
    • ORDER BYog GROUP BY skal v\u00e6r angitt med nummer i stedet for kolonne navn (se f\u00f8lgende for why). Gruppering b\u00f8r gj\u00f8res p\u00e5 kun noen f\u00e5 kolonne verdier.
    • Bruk helst UNION ALL fremfor UNION *
    • Unng\u00e5 bruk tabell alias i JOIN criterer. Det er ofte vanskelig \u00e5 forst\u00e5 hvor tabellen \"c\" kommer fra.
    • Hvis en joiner to eller flere tabeller, alltid prefiks kolonenne med et table alias. Hvis en selekterer fra kun en tabell trengs ingen prefiks.
    • Skriv eksplisite joins, alts\u00e5 skriv INNER JOIN instead of JOIN).
    • Bruk LEFT JOIN fremfor RIGHT JOIN

    • Ikke optimaliserer for f\u00e5 linjer kode. Nye linjer er billig, hjerner er dyre

    "},{"location":"arkitektur/style_guide/#eksempel-sql","title":"Eksempel SQL","text":"
    WITH\n\nmin_data AS (\n\n    SELECT * FROM {{ ref('min_data') }}\n\n),\n\nen_cte AS (\n\n    SELECT * FROM {{ ref('en_cte') }}\n\n),\n\nen_cte_agg AS (\n\n    SELECT\n        id,\n        SUM(felt_4) AS total_felt_4,\n        MAX(felt_5) AS max_felt_5\n\n    FROM en_cte\n    GROUP BY 1\n\n),\n\nendelig AS (\n\n    SELECT [DISITNCT]\n        min_data.felt_1,\n        min_data.felt_2,\n        min_data.felt_3,\n\n        -- Bruk linjeshift for visuelt separere kalkulasjoner inn i blokker.\n        CASE\n            WHEN min_data.kansellerings_dato IS NULL\n                AND min_data.utgangs_dato is not null\n                THEN utgangsdato_date\n            WHEN my_data.kansellerings_dato IS NULL\n                THEN my_data.start_dato + 7\n            ELSE my_data.kansellerings_date\n        END AS kansellerings_dato,\n\n        en_cte_agg.total_felt_4,\n        en_cte_agg.max_felt_5\n\n    FROM min_data\n    LEFT JOIN en_cte_agg  \n        ON min_data.id = en_cte_agg.id\n    WHERE min_data.felt_1 = 'abc'\n        AND (\n            min_data.felt_2 = 'def' OR\n            min_data.felt_2 = 'ghi'\n        )\n    HAVING COUNT(*) > 1\n\n)\n\nSELECT * FROM final\n
    • Bruk LEFT JOIN fremfor RIGHT JOIN:
      SELECT\n    reiser.*,\n    sjaforer.rating AS driver_rating,\n    passasjerer.rating AS rider_rating\n\nFROM resier\nLEFT JOIN personer AS sjaforer\n    ON reiser.fk_personer_sjaforer = sjaforer.pk_personer\nLEFT JOIN personer AS passasjerer\n    ON reiser.fk_personer_passasjerer = sjaforer.pk_personer\n
    "},{"location":"arkitektur/style_guide/#yaml-stil-guide","title":"YAML stil guide","text":"
    • Setning indenteres med to mellomrom
    • Lister skal v\u00e6re indentert
    • Bruk linjeskift for \u00e5 separere lister n\u00e5r n\u00f8dvendig.
    • Linjer skal ikke v\u00e6re lenger en 80 karakterer
    "},{"location":"arkitektur/style_guide/#eksample-yaml","title":"Eksample YAML","text":"
    version: 2\n\nmodels:\n  - name: hendelser\n    columns:\n      - name: pk_hendelser\n        description: Dette er n prim\u00e6rn\u00f8kkel\n        tests:\n          - unique\n          - not_null\n\n      - name: hendelse_ts \n        description: \"N\u00e5r hendelse skjedde i UTC (eg. 2018-01-01 12:00:00)\"\n        tests:\n          - not_null\n\n      - name: fk_brukere\n        description: Brukeren som st\u00e5 for hendelsen \n        tests:\n          - not_null\n          - relationships:\n              to: ref('brukere')\n              field: pk_brukere\n
    "},{"location":"arkitektur/style_guide/#jinja-stil-guide","title":"Jinja stil guide","text":"
    • Ved inklusjon av Jinja kode bruk mellomrom p\u00e5 iden av klammene {{ slik }} istedefor {{slik}}
    • Bruk ny linje for \u00e5 dele opp logik i Jinja blokker
    "},{"location":"dokumentasjon/dokumentasjon/","title":"Dokumentasjon","text":""},{"location":"dokumentasjon/dokumentasjon/#tabelldokumentasjon","title":"Tabelldokumentasjon","text":"

    Tabellene konfigureres og dokumenteres i yml filene i hver mappe i prosjektet. Kommentarer kan settes p\u00e5 b\u00e5de tabellniv\u00e5 og kolonneniv\u00e5. Les mer her.

    "},{"location":"dokumentasjon/dokumentasjon/#persist-docs","title":"Persist docs","text":"

    dbt-oracle har st\u00f8tte for \u00e5 skrive kommentarer til databasen. Som andre konfig, kan det settes p\u00e5 prosjektniv\u00e5, mappeniv\u00e5 eller modellniv\u00e5. For \u00e5 sette det p\u00e5 prosjektniv\u00e5, legg til f\u00f8lgende i dbt_project.yml

    models:\n  +persist_docs:\n    relation: true\n    columns: true\n

    En ting \u00e5 v\u00e6re oppmerksom p\u00e5 n\u00e5r persist_docs er aktivert er at kolonnenavn i modellen m\u00e5 v\u00e6re det samme som definert i yml filen.

    ORA-00904

    ORA-00904: \"KOLONNE\": invalid identifier\n
    SELECT\n  kolonne\nFROM ...\n
    - name: kolonne_navn\n  description: ...\n

    Her har Oracle fors\u00f8kt \u00e5 skrive kommentar til en kolonne som ikke eksisterer. Sammenlign modell og yml fil og sjekk at navnet p\u00e5 kolonnen er lik.

    "},{"location":"dokumentasjon/dokumentasjon/#overskrive-overview","title":"Overskrive overview","text":"

    Komponentdokumentasjonen kan integreres i dbt dokumentasjonen. I dbt/models folderen m\u00e5 det opprettes en overview.md fil. Bruk gjerne overview.md som mal

    "},{"location":"dokumentasjon/dokumentasjon/#deployere-dokumentasjon","title":"Deployere dokumentasjon","text":"

    Hver gang kommandoen dbt docs kj\u00f8res, genereres det tre filer i target mappa under dbt prosjektmappa: index.hml, catalog.json og manifest.json. Disse filene er statiske og inneholder alt som trengs for \u00e5 publisere en versjon av dokumentasjonen p\u00e5 en webserver.

    Github pages har slik st\u00f8tte. Publsiering til github pages kan gj\u00f8res p\u00e5 flere m\u00e5ter, men kanskje enklest er det \u00e5 bruke en github action:

    # Simple workflow for dbt docs content to GitHub Pages\nname: Deploy dbt docs to GitHub Pages\n\non:\n  push:\n    branches: [\"master\"]\n    paths:\n      - docs/**\n\n  workflow_dispatch:\n\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# Allow one concurrent deployment\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: true\n\njobs:\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup Pages\n        uses: actions/configure-pages@v2\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v1\n        with:\n          path: 'docs'\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v1\n
    1. Importer overst\u00e5ende github action i .workflow
    2. Kj\u00f8r kommandoen dbt docs generate
    3. Lag en docs mappe p\u00e5 roten av repoet, hvis det ikke allerede finnes.
    4. Kopier over filene index.hml, catalog.json og manifest.json fra target mappen til docs mappen.
    5. Commit og push til main branchen.
    6. Docen blir automatisk publisert av github action, til url spesifisert av jobben.
    "},{"location":"dokumentasjon/overview/","title":"Overview","text":"

    {% docs overview %}

    "},{"location":"dokumentasjon/overview/#xxx-komponenten","title":"XXX - komponenten","text":""},{"location":"dokumentasjon/overview/#formal","title":"Form\u00e5l","text":"

    Overordnet beskrivelse av form\u00e5l med l\u00f8sningen

    "},{"location":"dokumentasjon/overview/#komponentbeskrivelse","title":"Komponentbeskrivelse","text":"
    • Form\u00e5l:
    • Prinsipper:
    • Kilde(r):
    • Brukere:
    • Noe annet:
    "},{"location":"dokumentasjon/overview/#struktur-pa-repo","title":"Struktur p\u00e5 repo","text":"

    Lenke til dokumentasjon p\u00e5 confluence

    Vi har f\u00f8lgende mapper: - db (medf\u00f8lgende readme) - install (her ligger ddl filer per tabell/view. Ogs\u00e5 dcl-filer som gir grants) - patch (hvert script har jira-kode som prefiks og kort forklaring/tabellnavn). N\u00e5r man endrer en tabell her m\u00e5 man ogs\u00e5 endre den i install-filen) - utils (kanskje, hvis man trenger det) - dbt - dbt prosjektet. dette er stien der man kj\u00f8rer dbt kommandoer.

    "},{"location":"dokumentasjon/overview/#overordnet-design","title":"Overordnet design","text":""},{"location":"dokumentasjon/overview/#dataflyt-diagram","title":"Dataflyt-diagram","text":"

    Dataflyten finnes ved \u00e5 klikke p\u00e5 det bl\u00e5 ikonet nederst til h\u00f8yre p\u00e5 siden

    # DAG task kilde m\u00e5l kommentar"},{"location":"dokumentasjon/overview/#databasebeskrivelse","title":"Databasebeskrivelse","text":"

    En oversikt over de viktigste tabellene

    Tabell/Views Beskrivelse tabell1 besk tabell2 besk"},{"location":"dokumentasjon/overview/#databasescript","title":"Databasescript","text":"

    Referanser til hvor databasescriptene befinner seg

    "},{"location":"dokumentasjon/overview/#drift","title":"Drift","text":""},{"location":"dokumentasjon/overview/#workflows-og-kjretidspunkt","title":"Workflows og kj\u00f8retidspunkt","text":"

    Inneholder informasjon om viktige punkter for kj\u00f8retider

    "},{"location":"dokumentasjon/overview/#tilgangsstyring","title":"Tilgangsstyring","text":"

    Er det noen spesielle rettigheter som kreves for denne komponenten?

    "},{"location":"dokumentasjon/overview/#overvaking-og-datakvalitet","title":"Overv\u00e5king og datakvalitet","text":""},{"location":"dokumentasjon/overview/#datakvalitet","title":"Datakvalitet","text":"

    Det kj\u00f8res datakvalitetsm\u00e5linger for disse tabellene

    "},{"location":"dokumentasjon/overview/#overvaking","title":"Overv\u00e5king","text":"

    F\u00f8lgende Sitescope-monitorer kj\u00f8res for denne komponenten.

    "},{"location":"dokumentasjon/overview/#sikkerhet-og-personvern","title":"Sikkerhet og personvern","text":"

    Inneholder detaljer rundt f.eks tilgang

    Det er ikke utarbeidet PVK for denne komponenten.

    H\u00e5ndtering av kode 6 og 7: Under arbeid

    "},{"location":"dokumentasjon/overview/#backlog","title":"Backlog","text":"

    Lenke til jira-oversikt?

    "},{"location":"dokumentasjon/overview/#dbt-docs-brukerguide","title":"dbt docs - brukerguide","text":""},{"location":"dokumentasjon/overview/#navigasjon","title":"Navigasjon","text":"

    Du kan bruke navigasjonsfanene Project og Database p\u00e5 venstre side av vinduet for \u00e5 utforske modellene i komponenten.

    "},{"location":"dokumentasjon/overview/#prosjektfane","title":"Prosjektfane","text":"

    Prosjekt-fanen speiler katalogstrukturen til dbt-prosjektet ditt. I denne fanen kan du se alle modeller definert i dbt-prosjektet ditt, samt modeller importert fra dbt-pakker.

    "},{"location":"dokumentasjon/overview/#database-fanen","title":"Database-fanen","text":"

    Fanen Database viser ogs\u00e5 modellene dine, men i et format som ser mer ut som en databaseutforsker. Denne utsikten viser relasjoner (tabeller og visninger) gruppert i databaseskjemaer. Merk at ephemeral modeller ikke vises i dette grensesnittet, da de ikke finnes i databasen.

    "},{"location":"dokumentasjon/overview/#grafutforskning","title":"Grafutforskning","text":"

    Du kan klikke p\u00e5 det bl\u00e5 ikonet nederst til h\u00f8yre p\u00e5 siden for \u00e5 se lineage til modellene dine.

    P\u00e5 modellsidene vil du se de n\u00e6rmeste foreldrene og barna til modellen du utforsker. Ved \u00e5 klikke p\u00e5 Expand. knappen \u00f8verst til h\u00f8yre i denne avstamningsruten, vil du kunne se alle modellene som brukes til \u00e5 bygge, eller er bygget fra, modellen du utforsker.

    N\u00e5r den er utvidet, vil du kunne bruke --select og --exclude modellvalgsyntaks for \u00e5 filtrere modeller i grafen. For mer informasjon om modellvalg, sjekk ut dbt docs.

    Merk at du ogs\u00e5 kan h\u00f8yreklikke p\u00e5 modeller for \u00e5 filtrere og utforske grafen interaktivt.

    "},{"location":"dokumentasjon/overview/#mer-info","title":"Mer info","text":"
    • Hva er dbt

    {% enddocs %}

    "},{"location":"feilsoking/feilsoking/","title":"Feils\u00f8king","text":"

    Samleside for vanlige feilsistuasjoner som kan oppst\u00e5 med dbt og Oracle i NAV

    "},{"location":"feilsoking/feilsoking/#incremental","title":"Incremental","text":""},{"location":"feilsoking/feilsoking/#ora-00955-det-finnes-allerede-et-objekt-med-det-navnet","title":"ORA-00955: det finnes allerede et objekt med det navnet","text":"

    ???

    "},{"location":"feilsoking/feilsoking/#ora-00904-kolonne-invalid-identifier","title":"ORA-00904: \"KOLONNE\": invalid identifier","text":"

    Dersom persist_docs er aktivert i dbt_project.yml, ta en titt p\u00e5 siden om Dokumentasjon.

    "},{"location":"feilsoking/feilsoking/#kobling-mot-oracle-database","title":"Kobling mot oracle database","text":""},{"location":"feilsoking/feilsoking/#dpy-2029-https_proxy-requires-use-of-the-tcps-protocol","title":"DPY-2029: https_proxy requires use of the tcps protocol","text":"

    Bytte fra thin mode til cx mode. I outputen du f\u00e5r i terminalen, sjekk hvilken mode du kj\u00f8rer i. Kj\u00f8rer du i thin mode endr det til cx mode. Dette gj\u00f8res ved \u00e5 bruke Oracle Instant Client. Sett path til Oracle Instant Client i milj\u00f8veriabler og slett ORA_PYTHON_DRIVER_TYPE=thin fra milj\u00f8variabler.

    "},{"location":"prosjekter/dvh-sykefravar-dmx/","title":"dvh-sykefravar-dmx","text":"

    Eies av Team Sykefrav\u00e6r

    "},{"location":"prosjekter/dvh-sykefravar-dmx/#formal","title":"Form\u00e5l","text":"

    Analysetorg brukt til syfo (sykefrav\u00e6rsoppfoling)

    "},{"location":"prosjekter/dvh-sykefravar-dmx/#dokumentasjon","title":"Dokumentasjon","text":"
    • DBT: https://navikt.github.io/dvh-sykefravar-dmx
    • GitHub: navikt/dvh-sykefravar-dmx
    • Confluence:
      • Datavarehus/Systemomr\u00e5der/Sykefrav\u00e6r/Sykefrav\u00e6r - sykefrav\u00e6rsoppf\u00f8lging - intern statistikk for NAV-kontorene
      • NAV Datavarehus/Om oss/Team St\u00f8nadsstatistikk (STO)/Produktteam Sykefrav\u00e6r / Dagens sykefrav\u00e6rstatistikk i Datavarehuset

    slack: #dv-team-sykefrav\u00e6r

    "},{"location":"prosjekter/dvh_arb_cv/","title":"dvh_arb_cv","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_cv/#formal","title":"Form\u00e5l","text":"

    Siste versjon av CV-elementer og jobb\u00f8nsker per person registrert arbeidss\u00f8ker NAV.

    "},{"location":"prosjekter/dvh_arb_cv/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt: dvh_arb_cv
    • GitHub: navikt/dvh_arb_cv
    • Confluence:
      • dvh_arb_cv - data fra Arbeidsplassen.no - CV

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_permittering/","title":"dvh_arb_permittering","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_permittering/#formal","title":"Form\u00e5l","text":"

    NAV har behov for \u00e5 samle statistikk for oversikt over permitterte arbeidss\u00f8kere og forh\u00e5ndsmelding om permittering og masseoppsigelser.

    Arbeidsgivere som vurderer \u00e5 g\u00e5 til masseoppsigelser eller permitteringer, gir melding om dette til NAV. Fra 2020 blir disse meldingene sendt inn elektronisk til NAV, og registreres i l\u00f8sningen Permittering.

    Dekker i f\u00f8rste omgang forh\u00e5ndsmelding om permittering, dvs n\u00e5r virksomheter permittere over 10 personer s\u00e5 skal de melde til NAV p\u00e5 forh\u00e5nd.

    "},{"location":"prosjekter/dvh_arb_permittering/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_permittering
    • Confluence: dvh_arb_permittering

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_person/","title":"dvh_arb_person","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_person/#formal","title":"Form\u00e5l","text":"

    Arbeidsmakedsstatistikken.

    "},{"location":"prosjekter/dvh_arb_person/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_person
    • Confluence: dvh_arb_person - ny arbeidsmarkedsstatistikk

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_styrke_ssb/","title":"dvh_arb_styrke_ssb","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_styrke_ssb/#formal","title":"Form\u00e5l","text":"

    Komponenten leser data inn fra SSB i to forskjellige l\u00f8p:

    • Den ene delen leser inn data om arbeidsstyrken fra flatfil, direkte levert fra SSB kun for NAV. Denne delen h\u00e5ndterer personopplysninger.
    • Den andre delen leser data om arbeidsstyrken, fordelt p\u00e5 yrke/kj\u00f8nn fra SSB's offisielle statistikkbank. Inneholder ikke personopplysninger eller geografisk informasjon.
    "},{"location":"prosjekter/dvh_arb_styrke_ssb/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_styrke_ssb
    • Confluence: dvh_arb_styrke_ssb

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_tiltak/","title":"dvh_arb_tiltak","text":"

    Eies av Team Oppf\u00f8lging Eies av Team Oppf\u00f8lging)

    "},{"location":"prosjekter/dvh_arb_tiltak/#formal","title":"Form\u00e5l","text":"

    Brukes i Tiltaks- og oppf\u00f8lgingsstatistikken.

    "},{"location":"prosjekter/dvh_arb_tiltak/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_tiltak
    • Confluence: dvh_arb_person - ny arbeidsmarkedsstatistikk

    slack: #dv-oppf\u00f8lging

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/","title":"vdl-regnskapsdata","text":"

    Eies av Team-VDL

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/#formal","title":"Form\u00e5l","text":"

    Analysedata av hovedbok

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/#dokumentasjon","title":"Dokumentasjon","text":"
    • GitHub: navikt/vdl-regnskapsdata
    • Virksomhetsdata:
      • Om oss
      • Hovedbok
    • DBT: TODO!

    slack: #virksomhetsdatalaget

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduksjon til dbt","text":"

    dbt (data build tool) er et SQL basert transformasjonsvekt\u00f8y som lar deg modularisere og skrive testbar SQL kode. dbt s\u00f8rger for at SQLene blir kj\u00f8rt i riktig rekkef\u00f8lge slik at sluttproduktet blir oppdatert korrekt.

    En SQL fil i dbt blir kalt en modell i dbt. Modeller kan materialiseres p\u00e5 ulike m\u00e5ter. Som view, tabell eller rett og slett en SQL snutt som kan gjenbrukes i flere modeller etter DRY-prinsippet.

    dbt er IKKE et extract-load verkt\u00f8y. Det betyr at dataene som skal transformeres allerede m\u00e5 ligge i databasen dbt er koblet til. dbt krever alts\u00e5 at data er lastet p\u00e5 forh\u00e5nd, med feks en pythonjobb eller kafkakonsument. Dataene trenger ikke n\u00f8dvendigvis ligge i samme komponentskjema eller samme BigQuery prosjekt. S\u00e5 lenge dataene er tilgjengelig p\u00e5 samme database og dbt service brukeren har tilgang til \u00e5 lese dataene er du good to go.

    dbt kommer b\u00e5de i som open source i form av dbt-core og i en egen cloud versjon, dbt cloud. Cloud versjonen st\u00f8tter kun skydatabaser som feks. BigQuery og Snowflake. dbt Cloud kan derfor ikke brukes mot Oracle onprem databasen til datavarehus. For datasett som befinner seg p\u00e5 datamarkedsplassen i BigQuery, kan dbt Cloud v\u00e6re en mulighet.

    For Oracle on-prem benytter vi dbt-oracle som er en python pakke som baserer seg p\u00e5 dbt-core. Oracle er ikke offisielt st\u00f8ttet av dbt, men Oracle har tatt ansvar for community connectoren og og blir aktiv vedlikeholdt og fortl\u00f8pende oppdatert til siste versjon av dbt-core. For \u00e5 n\u00e5 on-prem Oracle m\u00e5 vi som kjent benytte utviklerimage. Denne guiden tar for seg installasjon og oppsett av dbt-oracle p\u00e5 vdi utvikler gjennom Visual Studio Code.

    "},{"location":"#lenker","title":"Lenker","text":"

    F\u00f8r du g\u00e5r gjennom detaljene p\u00e5 hvordan dbt b\u00f8r settes opp er det lurt \u00e5 bli kjent med hvordan dbt fungerer. Nedenfor er det et knippe nyttige lenker som hjelper deg med \u00e5 komme igang og l\u00e6re de viktigste kommandoene og funksjonene i dbt.

    "},{"location":"#kurs-dbt-fundamentals","title":"Kurs - dbt fundamentals","text":"

    Det er sterkt anbefalt \u00e5 starte med \u00e5 g\u00e5 gjennom fundamentals kurset til dbt labs. Dette kurset bruker dbt cloud, men mesteparten av innholdet kan overf\u00f8res til dbt-core. Bruk gjerne GCP dev milj\u00f8et til teamet for \u00e5 sette opp testprosjektet i BigQuery, men husk p\u00e5 \u00e5 slette ressursene i etterkant

    "},{"location":"#designprinsipper","title":"Designprinsipper","text":"

    How to design a dbt model from scratch. Hvordan b\u00f8r du tenke n\u00e5 du designer nye modeller med dbt? Det er fort gjort \u00e5 bomme p\u00e5 f\u00f8rste fors\u00f8k, og det koster mye tid.

    "},{"location":"#dimensjonsmodellering","title":"Dimensjonsmodellering","text":"

    Kimball er fortsatt relevant med dbt. Building a Kimball dimensional model with dbt

    "},{"location":"#bok","title":"Bok","text":"

    Det er nylig (juni 2023) lansert en bok om Data Engineering with dbt. Boken inneholder instroduksjon til data engineering generelt og endelt om ulike skydatabaser i tillegg til grunnleggende bruk av dbt. Kanskje den mest interessante delen er kapittel 8 som omhandler testing med dbt.

    "},{"location":"#nyttige-lenker","title":"Nyttige lenker","text":"

    dbt's egne guider: Lessons

    Community basert samling av lenker: awsome-dbt

    "},{"location":"#hvorfor-skal-jeg-bruke-dbt-jeg-kan-jo-kjre-sql-med-python","title":"Hvorfor skal jeg bruke dbt? Jeg kan jo kj\u00f8re SQL med Python","text":"

    Det er riktig. Dersom du bare skal kj\u00f8re noen enkle SQL sp\u00f8rringer er det kanskje like greit \u00e5 sette opp en Pythonjobb som kj\u00f8rer SQLen for deg. Men med en gang antall sp\u00f8rringer eller kompleksiteten p\u00e5 sp\u00f8rringene \u00f8ker vil dbt hjelpe med med \u00e5 strukturere koden og holde oversikt over rekkef\u00f8lgen. Det er ikke uvanlig at en komponent best\u00e5r av 30 eller flere SQL filer som avhenger av hverandre.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/","title":"DBT","text":"

    Det finnes en offisiell oracle adapter for dbt v1.x. Gjerne start med \u00e5 ta en titt p\u00e5 denne installasjonsguiden f\u00f8rst.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#installasjon","title":"Installasjon","text":"

    dbt kan installeres sammen med oracle adapteren med kommandoen:

    pip install dbt-oracle\n

    Nedlasting feiler

    $ pip install dbt-oracle\nWARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)'))': /simple/dbt-oracle/\n\n...\n\nCould not fetch URL https://pypi.org/simple/dbt-oracle/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/dbt-oracle/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)')))\n

    Sjekk om du har gjort oppsett av sertifikater til pip.

    Installasjon feiler

    I noen tilfeller har vi opplevd at Microsoft Visual C++ mangler. Feilmeldingen kan se slik ut:

    ...\nBuilding wheels for collected packages: cx-Oracle\nBuilding wheel for cx-Oracle (pyproject.toml) ... error\nerror: subprocess-exited-with-error\n\n\u00d7 Building wheel for cx-Oracle (pyproject.toml) did not run successfully.\n\u2502 exit code: 1\n\u2570\u2500> [8 lines of output]\n      C:\\Users\\RA_S167159\\AppData\\Local\\Temp\\pip-build-env-lh09agh5\\overlay\\Lib\\site-packages\\setuptools\\config\\expand.py:144: UserWarning: File 'C:\\\\Users\\\\RA_S167159\\\\AppData\\\\Local\\\\Temp\\\\pip-install-ki6mcccg\\\\cx-oracle_5a1e160a6cb5498187fe05d5b5637d8c\\\\README.md' cannot be found\n        warnings.warn(f\"File {path!r} cannot be found\")\n    pip_system_certs: ERROR: could not register module: No module named 'wrapt'\n    running bdist_wheel\n    running build\n    running build_ext\n    building 'cx_Oracle' extension\n    error: Microsoft Visual C++ 14.0 or greater is required. Get it with \"Microsoft C++ Build Tools\": https://visualstudio.microsoft.com/visual-cpp-build-tools/\n    [end of output]\n\nnote: This error originates from a subprocess, and is likely not a problem with pip.\nERROR: Failed building wheel for cx-Oracle\nFailed to build cx-Oracle\nERROR: Could not build wheels for cx-Oracle, which is required to install pyproject.toml-based projects\n...\n
    Last ned og installer Build Tools. F\u00f8lg gjerne guiden her: Fixed: Microsoft Visual C++ 14.0 Is Required Error Husk \u00e5 restarte VDI etter installasjon.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#opprette-nytt-dbt-prosjekt-for-oracle","title":"Opprette nytt dbt prosjekt for Oracle","text":"

    Oppsettet av nytt prosjekt er forenklet og tilpasset datavarehus. Det er laget eksempelprosjekt i repo dvh_template for bruk av dbt til komponentskjemaer. dbt prosjektet ligger i en egen branch dbt_template.

    • For nye komponenter er det bare \u00e5 opprette nytt github repo med utgangspunkt i dbt-template.
    • For eksisterende komponentrepoer, ta en kopi av dbt og lim inn i roten til komponentrepoet.

    Hvis du ikke \u00f8nsker \u00e5 ta i bruk standardprosjektet, men heller kj\u00f8re dbt init er det noen ting som kan skape uforst\u00e5elige feilmeldinger:

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#quoting","title":"Quoting","text":"

    Quoting av databasenavn m\u00e5 aktiveres i dbt_project.yml siden databasenenavnene til dvh-databasene er med sm\u00e5 bokstaver (eks. dwhu1). Hvis ikke dette gj\u00f8res kommer det feilmeling som sier noe slikt som approximate match

    For \u00e5 skru p\u00e5 quoting m\u00e5 f\u00f8lgende settes i dbt_project.yml:

    quoting:\n  database: true\n
    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#hemmeligheter-ved-kjring-fra-utviklerimage","title":"Hemmeligheter ved kj\u00f8ring fra utviklerimage","text":"

    Av sikkerhetshensyn anbefaler vi og oracle \u00e5 bruke milj\u00f8variabler for \u00e5 holde p\u00e5 hemmeligheter. Vi har derfor laget et script og profiles.yml som kan ligge i dbt-prosjektet.

    Scriptet kan lastes ned fra navikt/dvh_template/dbt/setup_db_user.ps1.

    profiles.yml skal opprettes i p\u00e5 toppniv\u00e5 i dbt-prosjektmappen, eksempel navikt/dvh_template/dbt/profiles.yml Merk at navn p\u00e5 profil er profilnavnet det henvises til i dbt_project.yml

    <navn p\u00e5 profil>:\n  target: \"{{env_var('DBT_DB_TARGET')}}\"\n ...\n

    N\u00e5r profilen er p\u00e5 plass i prosjektmappen kan du teste at dbt fungerer.

    "},{"location":"Installasjon-p%C3%A5-VDI/dbt/#teste-dbt-installasjonen","title":"Teste dbt installasjonen","text":"

    Etter at dbt er p\u00e5 plass kan du verifisere at dbt fungerer ved \u00e5 kj\u00f8re .\\setup_db_user.ps1 etterfulgt av dbt debug fra prosjektmappen. Er det et nytt prosjekt m\u00e5 du opprette profiles.yml f\u00f8rst.

    .\\setup_db_user.ps1 m\u00e5 kj\u00f8res hver gang en starter en ny terminal eller \u00f8nsker \u00e5 bytte target (db). Scriptet vill midlertidlig opprette milj\u00f8variablene i terminal-sesjonen for target, brukernavn, passord, schema og peke dbt mot profiles.yml i prosjektmappen.

    Success

    $ .\\setup_db_user.ps1\nTarget db: U <eventuelt Q,R eller P>\nSchema: \n\ncmdlet Get-Credential at command pipeline position 1\nSupply values for the following parameters:\nCredential\n\n$ dbt debug\n09:15:08  Running with dbt=1.1.1\ndbt version: 1.1.1\npython version: 3.8.10\npython path: c:\\users\\****\\appdata\\local\\programs\\python\\python38\\python.exe      \nos info: Windows-10-10.0.19044-SP0\nUsing profiles.yml file at C:\\Users\\****\\git\\dvh-sykefravar-dmx\\profiles.yml\nUsing dbt_project.yml file at C:\\Users\\****\\git\\dvh-sykefravar-dmx\\dbt_project.yml\n\n09:15:08  oracle adapter: Running in cx mode\nConfiguration:\n  profiles.yml file [OK found and valid]   \n  dbt_project.yml file [OK found and valid]\n\nRequired dependencies:\n- git [OK found]\n\nConnection:\n  user: ****\n  database: dwhu1\n  schema: ****\n  protocol: tcp\n  host: dm07-scan.adeo.no\n  port: 1521\n  tns_name: None\n  service: dwhu1\n  connection_string: None\n  shardingkey: []\n  supershardingkey: []\n  cclass: None\n  purity: None\n  Connection test: [OK connection ok]\n\nAll checks passed!\n

    DBT er n\u00e5 klart til bruk.

    Error

    Connection test: [ERROR]\n\n2 checks failed:\nError from git --help: Could not find command, ensure it is in the user's PATH and that the user has permissions to run it: \"git\"\n\ndbt was unable to connect to the specified database.\nThe database returned the following error:\n\n  >Database Error\n  DPI-1047: Cannot locate a 64-bit Oracle Client library: \"failed to get message for Windows Error 126\". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help\n\nCheck your database credentials and try again. For more information, visit:\nhttps://docs.getdbt.com/docs/configure-your-profile\n

    Oracle client library er mest sannsynlig ikke installert.

    "},{"location":"Installasjon-p%C3%A5-VDI/git/","title":"GIT","text":"
    1. Installering av GIT - har du den allerede er det flott.
    2. Denne finner du p\u00e5 felles disken under programvare. programvare\\git. Installer f.eks Git-2.30.2-64-bit. Legg installasjon directory inn i milj\u00f8variabel PATH. F.eks C:\\Users\\<brukernavn>\\AppData\\Local\\GitHubDesktop\\bin
    3. Dette steget er sannsynligvis ikke n\u00f8dvendig, og utf\u00f8res kun om det oppst\u00e5r problemer i senere steg. Oppdatere milj\u00f8variabler slik at utviklingsimaget kan kommunisere med Github. Dette er beskrevet i https://confluence.adeo.no/pages/viewpage.action?pageId=272519832 punkt 10c
    4. F\u00f8lgende legges inn som milj\u00f8 variabler
    5. https_proxy til http://webproxy-utvikler.nav.no:8088
    6. http_proxy: http://155.55.60.117:8088/
    7. no_proxy: localhost,127.0.0.1,*.adeo.no,.local,.adeo.no,.nav.no,.aetat.no,.devillo.no,.oera.no,devel
    8. Opprett et PAT (personal access token) som du m\u00e5 bruke som passord ved autentisering. Se https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token Alternativt kan du bruke GitHub Dekstop som setter dette opp for deg automatisk.
    9. Clone repositoriet du skal jobbe med. Husk \u00e5 bruke PAT opprettet i punkt 3. som passord om du ikke bruker GitHub Desktop.
    "},{"location":"Installasjon-p%C3%A5-VDI/installere/","title":"Installere DBT p\u00e5 VDI","text":""},{"location":"Installasjon-p%C3%A5-VDI/installere/#forutsetninger","title":"Forutsetninger","text":"

    For \u00e5 installere dbt m\u00e5 du ha f\u00f8lgende installert:

    • Python 3.10.x
    • PIP og oppsett av dbt-milj\u00f8
    • GIT / GitHub Desktop
    • Oracle client library
    "},{"location":"Installasjon-p%C3%A5-VDI/installere/#anbefalinger","title":"Anbefalinger","text":"

    For en god utvikleropplevelse anbefaler vi deg \u00e5 ha f\u00f8lgende installert:

    • Visual studio code eller en annen tekst editor
    • SQLFluff
    "},{"location":"Installasjon-p%C3%A5-VDI/miljovariabler/","title":"Legge til milj\u00f8variabler","text":"
    1. S\u00f8k etter milj\u00f8variabler
    2. Klikk p\u00e5: Rediger milj\u00f8bariabler for kontoen din
    1. Trykk p\u00e5 Ny...
    2. Gi variabelen et navn i Variabelnavn.
    3. Skriv inn path til programmet i Variabelverdi
    4. Trykk OK
    1. Marker Path variabelen
    2. Trykk Rediger...
    1. Trykk Ny
    2. Skriv inn navnet p\u00e5 variabelen du opprettet med syntaksen %<variabelnavn>% eks: %PIP%
    3. Trykk OK
    1. Trykk OK

    Note

    Husk at du m\u00e5 lukke cmd (ledetekst) og \u00e5pne p\u00e5 nytt for at endringen skal tre i kraft.

    "},{"location":"Installasjon-p%C3%A5-VDI/oracle-client-library/","title":"Oracle client library","text":"

    Note

    Dette steget utg\u00e5r hvis du bruker thin mode (tynnklient som ikke trenger klientbiblioteket. Introdusert i dbt-oracle 1.1.1). Det anbefales \u00e5 bruke thin mode, da kj\u00f8ring av kode g\u00e5r en del raskere.

    Dette finnes p\u00e5 fellesdisken og mappen programvare\\oracle\\ og kan kopieres lokalt. Det er er instantclient-basiclite-windows som benyttes.

    Oppdater PATH milj\u00f8variabelen med path til oracle client library. Eksmpel:

    C:\\data\\instantclient-basiclite-windows\\instantclient_19_11\n

    Note

    Se legg til milj\u00f8variabler hvis du ikke vet hvordan du oppdatere PATH.

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/","title":"PIP og oppsett av python med dbt","text":"

    Vi har laget et ferdig oppsett av et dbt prosjekt tilpasset NAV dvh. Enten lag et nytt repo basert p\u00e5 dvh_template eller amd_template avhengig av preferanse for komponentoppsett p\u00e5 github. Deretter m\u00e5 dbt_template merges inn for \u00e5 f\u00e5 integrert dbt prosjektet.

    F\u00f8lgende script (ogs\u00e5 p\u00e5 github) installerer et virtuelt python milj\u00f8 kun for dette prosjektet.

    pip --version\n

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/#feilsk-sjekk-om-du-har-pip","title":"Feils\u00f8k: Sjekk om du har PIP","text":"

    Har du installert python, s\u00e5 har du nesten sikkert ogs\u00e5 pip. Men dersom overst\u00e5ende feiler, kj\u00f8r pip --version for \u00e5 se om pip er tilgjengelig:

    pip --version\n

    Success

    pip --version\n\npip 21.1.1 from c:\\users\\*****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\pip (python 3.8)\n

    Fortsett til \"Sett opp config fil for pip\"

    Failure

    pip --version\n\n'pip' is not recognized as an internal or external command, operable program or batch file.\n

    Kj\u00f8r py -3 -m ensurepip for \u00e5 se om pip allerede eksisterer.

    Looking in links: c:\\Users\\****\\AppData\\Local\\Temp\\tmp4r6s0n91\nRequirement already satisfied: setuptools in c:\\users\\****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages (58.1.0)\nRequirement already satisfied: pip in c:\\users\\****\\appdata\\local\\programs\\python\\python38\\lib\\site-packages (21.2.4)\n

    I dette tilfelle m\u00e5 milj\u00f8variabelen PATH oppdateres. Bruk gjerne Fil utforsker for \u00e5 finne riktig path men normalt ligger PIP under:

    c:\\users\\<brukernavn>\\appdata\\local\\programs\\python\\python38\\scripts\n

    Info

    Se legg til milj\u00f8variabler hvis du ikke vet hvordan du oppdatere PATH.

    Husk at du m\u00e5 lukke og \u00e5pne cmd (ledetekst) etter path variabel er lagt inn. Du kan n\u00e5 verifisere at pip er tilgjengelig ved \u00e5 kj\u00f8re pip --version.

    "},{"location":"Installasjon-p%C3%A5-VDI/pip-og-oppsett/#oppsett-av-sertifikater-til-pip","title":"Oppsett av sertifikater til pip","text":"

    Note

    Dette steget skjer automatisk under kj\u00f8ring av setup_python_env.ps1 og er ikke lenger n\u00f8dvendig.

    Til vanlig bruker pip sitt eget sertifikat for \u00e5 validere at vi laster ned pakker fra riktig server. Siden VDI bruker en webproxy for \u00e5 kommunisere med omverdenen vill vi f\u00e5 en feilmeling ved pip install xxx.

    Error

    13:42:24  Encountered an error: External connection exception occurred:\nHTTPSConnectionPool(host='hub.getdbt.com', port=443): Max retries exceeded\nwith url: /api/v1/index.json (Caused by SSLError(SSLCertVerificationError(1,\n'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get\nlocal issuer certificate (_ssl.c:1108)')))\n

    For \u00e5 fikse feilen kan vi installere pakkene setuptools-scm og pip-system-certs som f\u00e5r pip til \u00e5 bruke Windows Certificate Store istedenfor.

    pip install setuptools-scm pip-system-certs --trusted-host pypi.org --trusted-host  files.pythonhosted.org\n
    "},{"location":"Installasjon-p%C3%A5-VDI/python/","title":"Python","text":"

    Sjekk om Python er installert med py --version. dbt-versjon 1.4 og senere st\u00f8tter Python-versjon 3.11, for en tidligere dbt-versjon m\u00e5 Python-versjon v\u00e6re >= 3.8 og < 3.11.

    Last eventuelt ned python 3.10.x og installer ved \u00e5 f\u00f8lge installsjonsveiviseren.

    py --version\n

    Success

    $ py --version\n\nPython 3.8.10\n

    Fortsett til PIP

    Failure

    $ py --version\n\nPython 3.6.4\n
    For gammel version av Python

    Last ned Python

    Failure

    $ py --version\n\npython is not recognized as an internal or external command, operable program, or batch file\n

    Python er ikke installert

    Last ned Python

    "},{"location":"Installasjon-p%C3%A5-VDI/sqlfluff/","title":"SQLFluff","text":"

    SQLFluff er en linter som hjelper oss med \u00e5 formattere SQL-koden p\u00e5 en fornuftig m\u00e5te.

    "},{"location":"Installasjon-p%C3%A5-VDI/sqlfluff/#installering-av-sqlfluff","title":"Installering av SQLFluff","text":"
    pip install sqlfluff sqlfluff-templater-dbt\n
    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/","title":"Visual Studio Code","text":"

    Bruk https://code.visualstudio.com/download, velg Windows versjonen. Last ned, pakk ut og start programmet code. F\u00f8lg instruksjonene ved innstalleringen.

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#anbefalte-extensions","title":"Anbefalte extensions","text":""},{"location":"Installasjon-p%C3%A5-VDI/vscode/#dbt-power-user","title":"dbt Power User","text":"

    dbt Power User gir oss en rekke nyttige verkt\u00f8y, som f.eks.:

    • Lekker lineage vist i VS Code
    • Auto-complete dbt code
    • SQL validator
    • Preview query results
    • En rekke snarveier, blant annet via egne knapper
    • Visning av generert SQL-kode (slipper \u00e5 lete den frem i target-mappen)

    dbt Power User p\u00e5 GitHub

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#installasjon-og-oppsett","title":"Installasjon og oppsett","text":"

    Installeres via VS Code Marketplace, f\u00f8lg installasjonsrutinene til Altimate

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#utover-standardinstallasjon-ma-flgende-hensyn-tas-for-bruk-pa-vdi-utvikler-og-mot-oracle-dvh","title":"Utover standardinstallasjon m\u00e5 f\u00f8lgende hensyn tas for bruk p\u00e5 VDI Utvikler og mot Oracle DVH:","text":"

    dbt Power User krever at man setter opp milj\u00f8variabler med credentials via PowerShell, f\u00f8r VS Code startes opp i samme PowerShell-sesjon.

    Det finnes et skript start_vscode_dbt.ps1 i dette repoet som setter opp milj\u00f8variable, oppretter ptyhon milj\u00f8 hvis det ikke finnes fra f\u00f8r, og starter Visual Studtio Code som forenkler denne prosessen.

    Skriptet er generelt og krever at stien til et gyldig dbt-prosjekt settes som argument i tillegg til schemanavnet dbt skal bruke som proxy. F.eks.:

    start_vscode_dbt.ps1 c:\\sti\\til\\dbt-prosjekt\\ skjemanavn\n

    (Her m\u00e5 \\c:\\sti\\til\\dbt-prosjekt\\ peke p\u00e5 mappen som inneholder dbt_project.yml)

    Ideen er at man kan legge skriptet et sted p\u00e5 utviklerimage, f.eks. c:\\datavarehus\\start_vscode_dbt.ps1, og lage snarveier p\u00e5 skrivebordet til hvert av prosjektene, slik at milj\u00f8et for hvert prosjekt kan startes opp med et dobbeltklikk.

    For slikt oppsett, gj\u00f8r f\u00f8lgende:

    1. H\u00f8yreklikk - hold - dra over skrivebordet - slipp. Velg Lag snarveier her.

    2. H\u00f8yreklikk p\u00e5 den nye snarveien og velg Egenskaper

    3. Fyll inn f\u00f8lgende tekst i M\u00e5l: C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noexit -ExecutionPolicy Bypass -File \"C:\\datavarehus\\start_vscode_dbt.ps1\" c:\\sti\\til\\dbt-prosjekt\\ skjemanavn

    4. Endre navn p\u00e5 snarvei til noe mer passende:

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#oracle-oppsett-for-preview-query","title":"Oracle oppsett for Preview query","text":"

    Preview query-template m\u00e5 endres for Oracle-bruk: 1. \u00c5pne Settings ved \u00e5 trykke CTRL + , 2. S\u00f8k etter dbt.queryTemplate 3. Endre skript til select * from ({query}) where ROWNUM <= {limit}

    Ref.: #dbtquerytemplate-for-oracle

    "},{"location":"Installasjon-p%C3%A5-VDI/vscode/#erfaringer-feil-som-har-oppstatt-ved-bruk-av-dbt-power-user","title":"Erfaringer - feil som har oppst\u00e5tt ved bruk av dbt Power User:","text":"
    • Hele dbt-prosjektet blir validert n\u00e5r prosjekt-mappen \u00e5pnes. Eventuelle initielle imports som er lagt inn i dbt_run.py, som f.eks. from google.cloud import secretmanager, vil gi feil i VDI Utvikler. Begrens initielle imports til grunnleggende behov.
    "},{"location":"arkitektur/style_guide/","title":"DBT Stil Guide","text":"

    forket fra https://github.com/dbt-labs/corp/blob/main/dbt_style_guide.md

    "},{"location":"arkitektur/style_guide/#modell-naming","title":"Modell Naming","text":"

    V\u00e5r modellere organiserers inn i tre hovedgrupper: staging, marts, base/intermediate. See f\u00f8lgnede diskusjon. The navngiving blir som f\u00f8lger:

    \u251c\u2500\u2500 dbt_project.yml\n\u2514\u2500\u2500 models\n    \u251c\u2500\u2500 marts\n    |   \u2514\u2500\u2500 core\n    |       \u251c\u2500\u2500 mellomlager\n    |       |   \u251c\u2500\u2500 mellomlager.yml\n    |       |   \u251c\u2500\u2500 posteringer__unionisert.sql\n    |       |   \u2514\u2500\u2500 posteringer__gruppert.sql\n    |       \u251c\u2500\u2500 core.docs\n    |       \u251c\u2500\u2500 dim_artskonti\n    |           \u251c\u2500\u2500 dim_artskonti.yml\n    |           \u2514\u2500\u2500 dim_artskonti.sql\n    |       \u251c\u2500\u2500 dim_konstnadssteder\n    |           \u251c\u2500\u2500 dim_konstnadssteder.yml\n    |           \u2514\u2500\u2500 dim_konstnadssteder.sql\n    |       \u2514\u2500\u2500 fak_hovedbok_posteringer\n    |           \u251c\u2500\u2500 fak_hovedbok_posteringer.yml\n    |           \u2514\u2500\u2500 fak_hovedbok_posteringer.sql\n    \u2514\u2500\u2500 staging\n        \u2514\u2500\u2500 oebs\n            \u251c\u2500\u2500 base\n            |   \u251c\u2500\u2500 base.yml\n            |   \u2514\u2500\u2500 base__oebs_kontoplan.sql\n            \u251c\u2500\u2500 src_oebs.yml\n            \u251c\u2500\u2500 src_oebs.docs\n            \u251c\u2500\u2500 stg_oebs__posteringerslinjer\n            |   \u251c\u2500\u2500 stg_oebs__posteringerslinjer.yml\n            |   \u2514\u2500\u2500 stg_oebs__posteringerslinjer.sql\n            \u251c\u2500\u2500 stg_oebs__budjsett_balanser\n            |   \u251c\u2500\u2500 stg_oebs__budjsett_balanser.yml\n            |   \u2514\u2500\u2500 stg_oebs__budjsett_balanser.sql\n
    - All objekter oppgis p\u00e5 flertallsform, slik som: stg_oebs__hovedbok_posteringslinjer, stg_oebs__artskonti, etc. - Basetabeller prefikses med base__, slik som: base__<source>_<object> - Mellomlagringstabeller skal avsluttes med et fortidsverb som indikerer hvilken handling som er gjort p\u00e5 objektet, slik som: hovedbok_posteringslinjer__filtrert_budsjett - Datatorg, eller marter, er fordelt mellom faktaer (uforandelig, verb) og dimensjoner (foranderlig, subjekt) og prefikses med fak_ og dim_, henholdvis. - Staged strukter inneholder alle kolonner fra r\u00e5-tabellen og utvides med avledede kolonner, for \u00e5 angi naturlig n\u00f8kler, hashed n\u00f8kler, omd\u00f8ping av kolonnenavn, etc.

    "},{"location":"arkitektur/style_guide/#model-konfigurasjon","title":"Model konfigurasjon","text":"
    • Model-spesifike attributer (som sort/dist keys) skal spesifiseres i modellen.
    • Hvis en spesifikk konfigurasjon som gjelder alle modeller i en folder, burde dette spesifiseres i dbt_project.yml.
    • Modell konfigurationer skal spesifiseres slik:

    {{\n  config(\n    materialized = 'table',\n    sort = 'id',\n    dist = 'id'\n  )\n}}\n
    - Marter b\u00f8r alltid configureres som tabeller - med mindre det er sv\u00e6rt gode grunner til \u00e5 ikke gj\u00f8re det.

    "},{"location":"arkitektur/style_guide/#dbt-konvensjoner","title":"DBT konvensjoner","text":"
    • Kun stg_og base_ sp\u00f8r mot sourceer.
    • Alle andre ref andre modeller.
    "},{"location":"arkitektur/style_guide/#tester","title":"Tester","text":"
    • Hver underfolder inneholder en .yml fil som tester alle modeller i folderen. Navnestandarden skal v\u00e6re <folder-navn>.yml.
    • Som et minimum, skal unique og not_null v\u00e6re testet p\u00e5 prim\u00e6r n\u00f8kkeler
    "},{"location":"arkitektur/style_guide/#navngivining-og-felt-konvensjoner","title":"Navngivining og felt konvensjoner","text":"
    • Skjema, tabell og kolonne nanv skal v\u00e6re snake_case.
    • Bruk navn basert p\u00e5 business terminologien, i stedet for kilde terminology.
    • Hver model skal ha en prim\u00e6r n\u00f8kkel.
    • Prim\u00e6r n\u00f8kkeler i modellen navngis som pk_<objekt>, alts\u00e5 pk_dim_person.
    • Fremmed n\u00f8kkeler angis som fk_<objekt>, tidsl\u00f8se enhets n\u00f8kkeler angis som ek_<objekt> og naturlige n\u00f8kkeler angis som lk_<objekt>.
    • For base og stage modeller skal felter v\u00e6re ordnet inne kategorier, fra identifikatorer til tidsstempler tilslutt.
    • Tidsstempel kolonner skal v\u00e6ver navngitt som <hendelse>_ts, e.g. lastet_ts, og skal v\u00e6re p\u00e5 UTC. for avvikende tidszoner skal tidzonen indikeres ved suffiks, e.g lastet_ts_pt.
    • Boolean verdier og skal oppgis mot er_ eller har_ og uttrykkes med 1 for Ja og 0 for Nei.
    • Bel\u00f8ps kolonner skal ha suffiks _nokfor, flyttalls, bel\u00f8p i kroner, og _orer for heltall bel\u00f8p i \u00f8rer.
    • S\u00e6r norske bokstaver som \u00c6, \u00d8, \u00c5 skal angis som ae, o og a.
    • Unng\u00e5r reservert word som kolonne navn.
    • Bruk samme feltnavn gjennom alle modellene hvor mulig, e.g. n\u00f8kkelen til dim_person skal v\u00e6re pk_dim_personog ikke pk_bruker.
    "},{"location":"arkitektur/style_guide/#cteer","title":"CTEer","text":"

    For mer informasjon om hvorfor vi bruker CTEer, see f\u00f8lgende post. Kortversjonen er at det hjelper oss \u00e5 samle kildene \u00f8verst, gj\u00f8re enkle transformasjoner og joiner i midten og se resultatet nederst. Oracle skal st\u00f8tte passthrough slik at masse wither p\u00e5 rad ikke p\u00e5virker ytelsen.

    • Alle {{ ref('...') }} settning skal plasseres i en egen CTE, ved toppen av fila.
    • Hvor det er mulig, skal en CTE gj\u00f8re en og kun en logisk mengde arbeid.
    • CTE navn skal v\u00e6re ordrike og beskrive hva denne faktisk gj\u00f8r.
    • CTE er med forvirrende eller avansert logik skal kommenteres like etter at den er definert.
      with\n\nhendelser_vask as (\n\n    -- Kommentarer\n    -- mer kommentarer\n    ...\n)\n
      ),
    • CTEer som gjenbrukes i feller modeller skal tas ut og bli egne modeller.
    • Modeller b\u00f8r avsluttest med en endelig CTE som selekterer hele det endelig produktet f\u00f8r modelen avslutted SELECT * FROM endelig.
    • CTEene skal formatere som f\u00f8lger:
    WITH\n\nhendelser AS (\n\n    ...\n\n),\n\n-- CTE comments go here\nfiltrerte_hendelser AS (\n\n    ...\n\n),\n\nendelig AS (\n\n    SELECT * FROM filtrerte_hendelser\n\n),\n\n\nSELECT * FROM endelig\n
    "},{"location":"arkitektur/style_guide/#sql-stil-guide","title":"SQL stil guide","text":"
    • Sett komma p\u00e5 slutten setningen
    • Bruke fire mellom rom for \u00e5 indentere koden, uten om ved predikatet, som skal v\u00e6re p\u00e5 linje med WHERE
    • Ingen linjer skal v\u00e6re lenger enn 80 tegn
    • All felt navn skal v\u00e6re skrevet med sm\u00e5 bokstaver, og alle funksjonsnavn (SELECT, WHERE, LEAD, etc.) med STORE.
    • Bruk alltid ASfor \u00e5 aliase tabeller og felt.
    • Alle felt skal angis f\u00f8r alle aggregater og vindu funskjoner.
    • Aggregering skal skal l\u00f8ses s\u00e5 tidlig som mulig, f\u00f8r en joiner med andre tabeller.
    • ORDER BYog GROUP BY skal v\u00e6r angitt med nummer i stedet for kolonne navn (se f\u00f8lgende for why). Gruppering b\u00f8r gj\u00f8res p\u00e5 kun noen f\u00e5 kolonne verdier.
    • Bruk helst UNION ALL fremfor UNION *
    • Unng\u00e5 bruk tabell alias i JOIN criterer. Det er ofte vanskelig \u00e5 forst\u00e5 hvor tabellen \"c\" kommer fra.
    • Hvis en joiner to eller flere tabeller, alltid prefiks kolonenne med et table alias. Hvis en selekterer fra kun en tabell trengs ingen prefiks.
    • Skriv eksplisite joins, alts\u00e5 skriv INNER JOIN instead of JOIN).
    • Bruk LEFT JOIN fremfor RIGHT JOIN

    • Ikke optimaliserer for f\u00e5 linjer kode. Nye linjer er billig, hjerner er dyre

    "},{"location":"arkitektur/style_guide/#eksempel-sql","title":"Eksempel SQL","text":"
    WITH\n\nmin_data AS (\n\n    SELECT * FROM {{ ref('min_data') }}\n\n),\n\nen_cte AS (\n\n    SELECT * FROM {{ ref('en_cte') }}\n\n),\n\nen_cte_agg AS (\n\n    SELECT\n        id,\n        SUM(felt_4) AS total_felt_4,\n        MAX(felt_5) AS max_felt_5\n\n    FROM en_cte\n    GROUP BY 1\n\n),\n\nendelig AS (\n\n    SELECT [DISITNCT]\n        min_data.felt_1,\n        min_data.felt_2,\n        min_data.felt_3,\n\n        -- Bruk linjeshift for visuelt separere kalkulasjoner inn i blokker.\n        CASE\n            WHEN min_data.kansellerings_dato IS NULL\n                AND min_data.utgangs_dato is not null\n                THEN utgangsdato_date\n            WHEN my_data.kansellerings_dato IS NULL\n                THEN my_data.start_dato + 7\n            ELSE my_data.kansellerings_date\n        END AS kansellerings_dato,\n\n        en_cte_agg.total_felt_4,\n        en_cte_agg.max_felt_5\n\n    FROM min_data\n    LEFT JOIN en_cte_agg  \n        ON min_data.id = en_cte_agg.id\n    WHERE min_data.felt_1 = 'abc'\n        AND (\n            min_data.felt_2 = 'def' OR\n            min_data.felt_2 = 'ghi'\n        )\n    HAVING COUNT(*) > 1\n\n)\n\nSELECT * FROM final\n
    • Bruk LEFT JOIN fremfor RIGHT JOIN:
      SELECT\n    reiser.*,\n    sjaforer.rating AS driver_rating,\n    passasjerer.rating AS rider_rating\n\nFROM resier\nLEFT JOIN personer AS sjaforer\n    ON reiser.fk_personer_sjaforer = sjaforer.pk_personer\nLEFT JOIN personer AS passasjerer\n    ON reiser.fk_personer_passasjerer = sjaforer.pk_personer\n
    "},{"location":"arkitektur/style_guide/#yaml-stil-guide","title":"YAML stil guide","text":"
    • Setning indenteres med to mellomrom
    • Lister skal v\u00e6re indentert
    • Bruk linjeskift for \u00e5 separere lister n\u00e5r n\u00f8dvendig.
    • Linjer skal ikke v\u00e6re lenger en 80 karakterer
    "},{"location":"arkitektur/style_guide/#eksample-yaml","title":"Eksample YAML","text":"
    version: 2\n\nmodels:\n  - name: hendelser\n    columns:\n      - name: pk_hendelser\n        description: Dette er n prim\u00e6rn\u00f8kkel\n        tests:\n          - unique\n          - not_null\n\n      - name: hendelse_ts \n        description: \"N\u00e5r hendelse skjedde i UTC (eg. 2018-01-01 12:00:00)\"\n        tests:\n          - not_null\n\n      - name: fk_brukere\n        description: Brukeren som st\u00e5 for hendelsen \n        tests:\n          - not_null\n          - relationships:\n              to: ref('brukere')\n              field: pk_brukere\n
    "},{"location":"arkitektur/style_guide/#jinja-stil-guide","title":"Jinja stil guide","text":"
    • Ved inklusjon av Jinja kode bruk mellomrom p\u00e5 iden av klammene {{ slik }} istedefor {{slik}}
    • Bruk ny linje for \u00e5 dele opp logik i Jinja blokker
    "},{"location":"dokumentasjon/dokumentasjon/","title":"Dokumentasjon","text":""},{"location":"dokumentasjon/dokumentasjon/#tabelldokumentasjon","title":"Tabelldokumentasjon","text":"

    Tabellene konfigureres og dokumenteres i yml filene i hver mappe i prosjektet. Kommentarer kan settes p\u00e5 b\u00e5de tabellniv\u00e5 og kolonneniv\u00e5. Les mer her.

    "},{"location":"dokumentasjon/dokumentasjon/#persist-docs","title":"Persist docs","text":"

    dbt-oracle har st\u00f8tte for \u00e5 skrive kommentarer til databasen. Som andre konfig, kan det settes p\u00e5 prosjektniv\u00e5, mappeniv\u00e5 eller modellniv\u00e5. For \u00e5 sette det p\u00e5 prosjektniv\u00e5, legg til f\u00f8lgende i dbt_project.yml

    models:\n  +persist_docs:\n    relation: true\n    columns: true\n

    En ting \u00e5 v\u00e6re oppmerksom p\u00e5 n\u00e5r persist_docs er aktivert er at kolonnenavn i modellen m\u00e5 v\u00e6re det samme som definert i yml filen.

    ORA-00904

    ORA-00904: \"KOLONNE\": invalid identifier\n
    SELECT\n  kolonne\nFROM ...\n
    - name: kolonne_navn\n  description: ...\n

    Her har Oracle fors\u00f8kt \u00e5 skrive kommentar til en kolonne som ikke eksisterer. Sammenlign modell og yml fil og sjekk at navnet p\u00e5 kolonnen er lik.

    "},{"location":"dokumentasjon/dokumentasjon/#overskrive-overview","title":"Overskrive overview","text":"

    Komponentdokumentasjonen kan integreres i dbt dokumentasjonen. I dbt/models folderen m\u00e5 det opprettes en overview.md fil. Bruk gjerne overview.md som mal

    "},{"location":"dokumentasjon/dokumentasjon/#deployere-dokumentasjon","title":"Deployere dokumentasjon","text":"

    Hver gang kommandoen dbt docs kj\u00f8res, genereres det tre filer i target mappa under dbt prosjektmappa: index.hml, catalog.json og manifest.json. Disse filene er statiske og inneholder alt som trengs for \u00e5 publisere en versjon av dokumentasjonen p\u00e5 en webserver.

    Github pages har slik st\u00f8tte. Publsiering til github pages kan gj\u00f8res p\u00e5 flere m\u00e5ter, men kanskje enklest er det \u00e5 bruke en github action:

    # Simple workflow for dbt docs content to GitHub Pages\nname: Deploy dbt docs to GitHub Pages\n\non:\n  push:\n    branches: [\"master\"]\n    paths:\n      - docs/**\n\n  workflow_dispatch:\n\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# Allow one concurrent deployment\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: true\n\njobs:\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup Pages\n        uses: actions/configure-pages@v2\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v1\n        with:\n          path: 'docs'\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v1\n
    1. Importer overst\u00e5ende github action i .workflow
    2. Kj\u00f8r kommandoen dbt docs generate
    3. Lag en docs mappe p\u00e5 roten av repoet, hvis det ikke allerede finnes.
    4. Kopier over filene index.hml, catalog.json og manifest.json fra target mappen til docs mappen.
    5. Commit og push til main branchen.
    6. Docen blir automatisk publisert av github action, til url spesifisert av jobben.
    "},{"location":"dokumentasjon/overview/","title":"Overview","text":"

    {% docs overview %}

    "},{"location":"dokumentasjon/overview/#xxx-komponenten","title":"XXX - komponenten","text":""},{"location":"dokumentasjon/overview/#formal","title":"Form\u00e5l","text":"

    Overordnet beskrivelse av form\u00e5l med l\u00f8sningen

    "},{"location":"dokumentasjon/overview/#komponentbeskrivelse","title":"Komponentbeskrivelse","text":"
    • Form\u00e5l:
    • Prinsipper:
    • Kilde(r):
    • Brukere:
    • Noe annet:
    "},{"location":"dokumentasjon/overview/#struktur-pa-repo","title":"Struktur p\u00e5 repo","text":"

    Lenke til dokumentasjon p\u00e5 confluence

    Vi har f\u00f8lgende mapper: - db (medf\u00f8lgende readme) - install (her ligger ddl filer per tabell/view. Ogs\u00e5 dcl-filer som gir grants) - patch (hvert script har jira-kode som prefiks og kort forklaring/tabellnavn). N\u00e5r man endrer en tabell her m\u00e5 man ogs\u00e5 endre den i install-filen) - utils (kanskje, hvis man trenger det) - dbt - dbt prosjektet. dette er stien der man kj\u00f8rer dbt kommandoer.

    "},{"location":"dokumentasjon/overview/#overordnet-design","title":"Overordnet design","text":""},{"location":"dokumentasjon/overview/#dataflyt-diagram","title":"Dataflyt-diagram","text":"

    Dataflyten finnes ved \u00e5 klikke p\u00e5 det bl\u00e5 ikonet nederst til h\u00f8yre p\u00e5 siden

    # DAG task kilde m\u00e5l kommentar"},{"location":"dokumentasjon/overview/#databasebeskrivelse","title":"Databasebeskrivelse","text":"

    En oversikt over de viktigste tabellene

    Tabell/Views Beskrivelse tabell1 besk tabell2 besk"},{"location":"dokumentasjon/overview/#databasescript","title":"Databasescript","text":"

    Referanser til hvor databasescriptene befinner seg

    "},{"location":"dokumentasjon/overview/#drift","title":"Drift","text":""},{"location":"dokumentasjon/overview/#workflows-og-kjretidspunkt","title":"Workflows og kj\u00f8retidspunkt","text":"

    Inneholder informasjon om viktige punkter for kj\u00f8retider

    "},{"location":"dokumentasjon/overview/#tilgangsstyring","title":"Tilgangsstyring","text":"

    Er det noen spesielle rettigheter som kreves for denne komponenten?

    "},{"location":"dokumentasjon/overview/#overvaking-og-datakvalitet","title":"Overv\u00e5king og datakvalitet","text":""},{"location":"dokumentasjon/overview/#datakvalitet","title":"Datakvalitet","text":"

    Det kj\u00f8res datakvalitetsm\u00e5linger for disse tabellene

    "},{"location":"dokumentasjon/overview/#overvaking","title":"Overv\u00e5king","text":"

    F\u00f8lgende Sitescope-monitorer kj\u00f8res for denne komponenten.

    "},{"location":"dokumentasjon/overview/#sikkerhet-og-personvern","title":"Sikkerhet og personvern","text":"

    Inneholder detaljer rundt f.eks tilgang

    Det er ikke utarbeidet PVK for denne komponenten.

    H\u00e5ndtering av kode 6 og 7: Under arbeid

    "},{"location":"dokumentasjon/overview/#backlog","title":"Backlog","text":"

    Lenke til jira-oversikt?

    "},{"location":"dokumentasjon/overview/#dbt-docs-brukerguide","title":"dbt docs - brukerguide","text":""},{"location":"dokumentasjon/overview/#navigasjon","title":"Navigasjon","text":"

    Du kan bruke navigasjonsfanene Project og Database p\u00e5 venstre side av vinduet for \u00e5 utforske modellene i komponenten.

    "},{"location":"dokumentasjon/overview/#prosjektfane","title":"Prosjektfane","text":"

    Prosjekt-fanen speiler katalogstrukturen til dbt-prosjektet ditt. I denne fanen kan du se alle modeller definert i dbt-prosjektet ditt, samt modeller importert fra dbt-pakker.

    "},{"location":"dokumentasjon/overview/#database-fanen","title":"Database-fanen","text":"

    Fanen Database viser ogs\u00e5 modellene dine, men i et format som ser mer ut som en databaseutforsker. Denne utsikten viser relasjoner (tabeller og visninger) gruppert i databaseskjemaer. Merk at ephemeral modeller ikke vises i dette grensesnittet, da de ikke finnes i databasen.

    "},{"location":"dokumentasjon/overview/#grafutforskning","title":"Grafutforskning","text":"

    Du kan klikke p\u00e5 det bl\u00e5 ikonet nederst til h\u00f8yre p\u00e5 siden for \u00e5 se lineage til modellene dine.

    P\u00e5 modellsidene vil du se de n\u00e6rmeste foreldrene og barna til modellen du utforsker. Ved \u00e5 klikke p\u00e5 Expand. knappen \u00f8verst til h\u00f8yre i denne avstamningsruten, vil du kunne se alle modellene som brukes til \u00e5 bygge, eller er bygget fra, modellen du utforsker.

    N\u00e5r den er utvidet, vil du kunne bruke --select og --exclude modellvalgsyntaks for \u00e5 filtrere modeller i grafen. For mer informasjon om modellvalg, sjekk ut dbt docs.

    Merk at du ogs\u00e5 kan h\u00f8yreklikke p\u00e5 modeller for \u00e5 filtrere og utforske grafen interaktivt.

    "},{"location":"dokumentasjon/overview/#mer-info","title":"Mer info","text":"
    • Hva er dbt

    {% enddocs %}

    "},{"location":"feilsoking/feilsoking/","title":"Feils\u00f8king","text":"

    Samleside for vanlige feilsistuasjoner som kan oppst\u00e5 med dbt og Oracle i NAV

    "},{"location":"feilsoking/feilsoking/#incremental","title":"Incremental","text":""},{"location":"feilsoking/feilsoking/#ora-00955-det-finnes-allerede-et-objekt-med-det-navnet","title":"ORA-00955: det finnes allerede et objekt med det navnet","text":"

    ???

    "},{"location":"feilsoking/feilsoking/#ora-00904-kolonne-invalid-identifier","title":"ORA-00904: \"KOLONNE\": invalid identifier","text":"

    Dersom persist_docs er aktivert i dbt_project.yml, ta en titt p\u00e5 siden om Dokumentasjon.

    "},{"location":"feilsoking/feilsoking/#kobling-mot-oracle-database","title":"Kobling mot oracle database","text":""},{"location":"feilsoking/feilsoking/#dpy-2029-https_proxy-requires-use-of-the-tcps-protocol","title":"DPY-2029: https_proxy requires use of the tcps protocol","text":"

    Bytte fra thin mode til cx mode. I outputen du f\u00e5r i terminalen, sjekk hvilken mode du kj\u00f8rer i. Kj\u00f8rer du i thin mode endr det til cx mode. Dette gj\u00f8res ved \u00e5 bruke Oracle Instant Client. Sett path til Oracle Instant Client i milj\u00f8veriabler og slett ORA_PYTHON_DRIVER_TYPE=thin fra milj\u00f8variabler.

    "},{"location":"prosjekter/dvh-sykefravar-dmx/","title":"dvh-sykefravar-dmx","text":"

    Eies av Team Sykefrav\u00e6r

    "},{"location":"prosjekter/dvh-sykefravar-dmx/#formal","title":"Form\u00e5l","text":"

    Analysetorg brukt til syfo (sykefrav\u00e6rsoppfoling)

    "},{"location":"prosjekter/dvh-sykefravar-dmx/#dokumentasjon","title":"Dokumentasjon","text":"
    • DBT: https://navikt.github.io/dvh-sykefravar-dmx
    • GitHub: navikt/dvh-sykefravar-dmx
    • Confluence:
      • Datavarehus/Systemomr\u00e5der/Sykefrav\u00e6r/Sykefrav\u00e6r - sykefrav\u00e6rsoppf\u00f8lging - intern statistikk for NAV-kontorene
      • NAV Datavarehus/Om oss/Team St\u00f8nadsstatistikk (STO)/Produktteam Sykefrav\u00e6r / Dagens sykefrav\u00e6rstatistikk i Datavarehuset

    slack: #dv-team-sykefrav\u00e6r

    "},{"location":"prosjekter/dvh_arb_cv/","title":"dvh_arb_cv","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_cv/#formal","title":"Form\u00e5l","text":"

    Siste versjon av CV-elementer og jobb\u00f8nsker per person registrert arbeidss\u00f8ker NAV.

    "},{"location":"prosjekter/dvh_arb_cv/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt: dvh_arb_cv
    • GitHub: navikt/dvh_arb_cv
    • Confluence:
      • dvh_arb_cv - data fra Arbeidsplassen.no - CV

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_permittering/","title":"dvh_arb_permittering","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_permittering/#formal","title":"Form\u00e5l","text":"

    NAV har behov for \u00e5 samle statistikk for oversikt over permitterte arbeidss\u00f8kere og forh\u00e5ndsmelding om permittering og masseoppsigelser.

    Arbeidsgivere som vurderer \u00e5 g\u00e5 til masseoppsigelser eller permitteringer, gir melding om dette til NAV. Fra 2020 blir disse meldingene sendt inn elektronisk til NAV, og registreres i l\u00f8sningen Permittering.

    Dekker i f\u00f8rste omgang forh\u00e5ndsmelding om permittering, dvs n\u00e5r virksomheter permittere over 10 personer s\u00e5 skal de melde til NAV p\u00e5 forh\u00e5nd.

    "},{"location":"prosjekter/dvh_arb_permittering/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_permittering
    • Confluence: dvh_arb_permittering

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_person/","title":"dvh_arb_person","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_person/#formal","title":"Form\u00e5l","text":"

    Arbeidsmakedsstatistikken.

    "},{"location":"prosjekter/dvh_arb_person/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_person
    • Confluence: dvh_arb_person - ny arbeidsmarkedsstatistikk

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_styrke_ssb/","title":"dvh_arb_styrke_ssb","text":"

    Eies av A-Team

    "},{"location":"prosjekter/dvh_arb_styrke_ssb/#formal","title":"Form\u00e5l","text":"

    Komponenten leser data inn fra SSB i to forskjellige l\u00f8p:

    • Den ene delen leser inn data om arbeidsstyrken fra flatfil, direkte levert fra SSB kun for NAV. Denne delen h\u00e5ndterer personopplysninger.
    • Den andre delen leser data om arbeidsstyrken, fordelt p\u00e5 yrke/kj\u00f8nn fra SSB's offisielle statistikkbank. Inneholder ikke personopplysninger eller geografisk informasjon.
    "},{"location":"prosjekter/dvh_arb_styrke_ssb/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_styrke_ssb
    • Confluence: dvh_arb_styrke_ssb

    slack: #dv-a-team

    "},{"location":"prosjekter/dvh_arb_tiltak/","title":"dvh_arb_tiltak","text":"

    Eies av Team Oppf\u00f8lging Eies av Team Oppf\u00f8lging)

    "},{"location":"prosjekter/dvh_arb_tiltak/#formal","title":"Form\u00e5l","text":"

    Brukes i Tiltaks- og oppf\u00f8lgingsstatistikken.

    "},{"location":"prosjekter/dvh_arb_tiltak/#dokumentasjon","title":"Dokumentasjon","text":"
    • dbt:
    • GitHub: navikt/dvh_arb_tiltak
    • Confluence: dvh_arb_person - ny arbeidsmarkedsstatistikk

    slack: #dv-oppf\u00f8lging

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/","title":"vdl-regnskapsdata","text":"

    Eies av Team-VDL

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/#formal","title":"Form\u00e5l","text":"

    Analysedata av hovedbok

    "},{"location":"prosjekter/nystol/vdl-regnskapsdata/#dokumentasjon","title":"Dokumentasjon","text":"
    • GitHub: navikt/vdl-regnskapsdata
    • Virksomhetsdata:
      • Om oss
      • Hovedbok
    • DBT: TODO!

    slack: #virksomhetsdatalaget

    "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index e29be7e..564c95b 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,107 +2,107 @@ https://navikt.github.io/dbt-i-nav/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/dbt/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/git/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/installere/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/miljovariabler/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/oracle-client-library/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/pip-og-oppsett/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/python/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/sqlfluff/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/Installasjon-p%C3%A5-VDI/vscode/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/arkitektur/style_guide/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/dokumentasjon/dokumentasjon/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/dokumentasjon/overview/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/feilsoking/feilsoking/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh-sykefravar-dmx/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh_arb_cv/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh_arb_permittering/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh_arb_person/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh_arb_styrke_ssb/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/dvh_arb_tiltak/ - 2023-12-19 + 2023-12-20 daily https://navikt.github.io/dbt-i-nav/prosjekter/nystol/vdl-regnskapsdata/ - 2023-12-19 + 2023-12-20 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 1a42829300f88ff7f0ad09090d5c0120ca990c61..0cef56e17eb3e1caf0a218d2c19bf62bd74c7684 100644 GIT binary patch literal 455 zcmV;&0XY62iwFomwSr{=|8r?{Wo=<_E_iKh0M(blirX*{hVT0n!LUbJ*(`;&I9^Ii zVef6PLAGRjB3aUE#?JcfJ4v=Bl%5I&OBYMyU*m6#JTtDIUPrf?O+pBMUp$oCVq<(8 zH28jBeE;@Uyf2>WyJ|`f4Q*KLabFBX@uQTd)2T!tGpdMXNWH{%;04MzquiDsiu!KD zEqR6#A&St85F_WjOh1XZ&=7o{?D*n3 zH+5Z}^fPk#Tz4W;$#R9ZG$o0&ICJPHSUIu|b{aXeT;BH|t9-ZvcUm);)2fj>0}g}b z4)AumX5yFv9{D_T?bP!iaIx%OaX}S&e9egbpi*;a=iG>+Nh1(j@;WEK*m314&vr~WjU6O8u(WgSe(u<|@U+3Q$`R-giybg9XnTX)sF5BemY-L>S zHMn+{{rdSNzGe^QO)*A`hE^B*N-8eNtPk9T}ja3d_>WTyiHp@bugxC8N(%^NuU2pHiW-B)LEP1nC z$?8tI)-=()lv;tE3wdR^0LgzuA7p!WNXqiV58jDz`{VBR`xo*1@%bc46P(3qg2Uy8 zi6%|{0qns~DuSvwh%{sHQPtLn+JbQ;EL2g&In7W41mRoZL*Sg3=qC|o>by&n9bar? z$EHb>enKvv%T7cp_FSQR8lyy-t=YFDEF4+;ejGTnoZt6C(YCJsPsN$Z^aWygi5kaws# xYscQ~5v$b52`s5T6>2vlc`GMvMKrC$p8s^UBK7(F=L@%=