- ID de exploración:
- f105c567-ef13-41e0-8489-9831335fc5d1Finalizado
- URL enviada:
- https://cloudydatablog.net/
- Informe finalizado:
Enlaces: 16 encontrados
Los enlaces salientes identificados en la página
Enlace | Texto |
---|---|
https://github.com/geoserver/docker | Official Geoserver Docker Image GITHUB |
https://geoserver.org/ | Geoserver Official Website |
https://adoptium.net/en-GB/members/ | https://adoptium.net/en-GB/members/ |
https://adoptium.net/en-GB/ | https://adoptium.net/en-GB/ |
https://www.youtube.com/watch?v=JlLvyzuSyFU | Video Installing Adoptium JDK on Windows |
https://learn.microsoft.com/en-us/azure/azure-sql/database/firewall-configure?view=azuresql | Setting IP White List in SQL Azure |
https://data.spatialhub.scot/dataset/?groups=national | Spatial data hub |
https://blog.hubspot.com/website/html-elements | here |
https://sweetalert2.github.io/ | Sweet alert 2 |
https://asprunner.com/forums/topic/29701-Guide-52--Using-sweetalert2-to-confirm-save-data | Thread |
Variables JavaScript: 19 encontradas
Las variables JavaScript globales cargadas en el objeto de ventana de una página son variables declaradas fuera de las funciones y a las que se puede acceder desde cualquier lugar del código en el ámbito actual
Nombre | Tipo |
---|---|
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
_wpemojiSettings | object |
$ | undefined |
jQuery | function |
screenReaderText | object |
gtag | function |
dataLayer | object |
google_tag_manager | object |
Mensajes de registro de la consola: 1 encontrados
Mensajes registrados en la consola web
Tipo | Categoría | Registro |
---|---|---|
log | other |
|
HTML
El cuerpo HTML sin procesar de la página
<!DOCTYPE html><html lang="en-GB" class="js"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="profile" href="https://gmpg.org/xfn/11">
<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
<title>Cloudy DATA Blog – Technical ramblings | Mark Brooks</title>
<meta name="robots" content="max-image-preview:large">
<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
<link rel="dns-prefetch" href="//www.googletagmanager.com">
<link rel="alternate" type="application/rss+xml" title="Cloudy DATA Blog » Feed" href="https://cloudydatablog.net/feed/">
<link rel="alternate" type="application/rss+xml" title="Cloudy DATA Blog » Comments Feed" href="https://cloudydatablog.net/comments/feed/">
<!-- This site uses the Google Analytics by ExactMetrics plugin v8.2.2 - Using Analytics tracking - https://www.exactmetrics.com/ -->
<!-- Note: ExactMetrics is not currently configured on this site. The site owner needs to authenticate with Google Analytics in the ExactMetrics settings panel. -->
<!-- No tracking code set -->
<!-- / Google Analytics by ExactMetrics -->
<script>
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/cloudydatablog.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.7.1"}};
/*! This file is auto-generated */
!function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);
</script>
<style id="wp-emoji-styles-inline-css">
img.wp-smiley, img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 0.07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel="stylesheet" id="wp-block-library-css" href="https://cloudydatablog.net/wp-includes/css/dist/block-library/style.min.css?ver=6.7.1" media="all">
<style id="wp-block-library-theme-inline-css">
.wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em}
</style>
<style id="kevinbatdorf-code-block-pro-style-inline-css">
.wp-block-kevinbatdorf-code-block-pro{direction:ltr!important;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;-webkit-text-size-adjust:100%!important;box-sizing:border-box!important;position:relative!important}.wp-block-kevinbatdorf-code-block-pro *{box-sizing:border-box!important}.wp-block-kevinbatdorf-code-block-pro pre,.wp-block-kevinbatdorf-code-block-pro pre *{font-size:inherit!important;line-height:inherit!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre{background-image:none!important;border:0!important;border-radius:0!important;border-style:none!important;border-width:0!important;color:inherit!important;font-family:inherit!important;margin:0!important;overflow:auto!important;overflow-wrap:normal!important;padding:16px 0 16px 16px!important;text-align:left!important;white-space:pre!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.wp-block-kevinbatdorf-code-block-pro.padding-disabled:not(.code-block-pro-editor) pre{padding:0!important}.wp-block-kevinbatdorf-code-block-pro.padding-bottom-disabled pre{padding-bottom:0!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code{background:none!important;background-color:transparent!important;border:0!important;border-radius:0!important;border-style:none!important;border-width:0!important;color:inherit!important;display:block!important;font-family:inherit!important;margin:0!important;overflow-wrap:normal!important;padding:0!important;text-align:left!important;white-space:pre!important;width:100%!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code .line{display:inline-block!important;min-width:var(--cbp-block-width,100%)!important;vertical-align:top!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code .line{padding-left:calc(12px + var(--cbp-line-number-width, auto))!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code{counter-increment:step calc(var(--cbp-line-number-start, 1) - 1)!important;counter-reset:step!important}.wp-block-kevinbatdorf-code-block-pro pre code .line{position:relative!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre code .line:before{content:""!important;display:inline-block!important}.wp-block-kevinbatdorf-code-block-pro.cbp-has-line-numbers:not(.code-block-pro-editor) pre code .line:not(.cbp-line-number-disabled):before{color:var(--cbp-line-number-color,#999)!important;content:counter(step)!important;counter-increment:step!important;left:0!important;opacity:.5!important;position:absolute!important;text-align:right!important;transition-duration:.5s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important;width:var(--cbp-line-number-width,auto)!important}.wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover .line{min-height:var(--cbp-block-height,100%)!important}.wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{background:var(--cbp-line-highlight-color,rgb(14 165 233/.2))!important;left:-16px!important;min-height:var(--cbp-block-height,100%)!important;min-width:calc(var(--cbp-block-width, 100%) + 16px)!important;pointer-events:none!important;position:absolute!important;top:0!important;width:100%!important}[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Comic-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-.125rem!important}[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Fira-Code].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-1.5px!important}[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf"].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro .line.cbp-line-highlight .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro .line.cbp-no-blur:hover .cbp-line-highlighter,[data-code-block-pro-font-family=Code-Pro-Cozette].wp-block-kevinbatdorf-code-block-pro.cbp-highlight-hover:not(.cbp-blur-enabled:not(.cbp-unblur-on-hover)) .line:hover .cbp-line-highlighter{top:-1px!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor).padding-disabled pre .line.cbp-line-highlight:after{left:0!important;width:100%!important}.wp-block-kevinbatdorf-code-block-pro.cbp-blur-enabled pre .line:not(.cbp-no-blur){filter:blur(1px)!important;opacity:.4!important;pointer-events:none!important;transition-duration:.2s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.wp-block-kevinbatdorf-code-block-pro.cbp-blur-enabled.cbp-unblur-on-hover:hover pre .line:not(.cbp-no-blur){opacity:1!important;pointer-events:auto!important;--tw-blur: ;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.wp-block-kevinbatdorf-code-block-pro:not(.code-block-pro-editor) pre *{font-family:inherit!important}.cbp-see-more-simple-btn-hover{transition-property:none!important}.cbp-see-more-simple-btn-hover:hover{box-shadow:inset 0 0 100px 100px hsla(0,0%,100%,.1)!important}.code-block-pro-copy-button{border:0!important;border-style:none!important;border-width:0!important;cursor:pointer!important;left:auto!important;line-height:1!important;opacity:.1!important;padding:6px!important;position:absolute!important;right:0!important;top:0!important;transition-duration:.2s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;z-index:10!important}.code-block-pro-copy-button:focus{opacity:.4!important}.code-block-pro-copy-button:not([data-has-text-button]){background:none!important;background-color:transparent!important}.wp-block-kevinbatdorf-code-block-pro.padding-disabled .code-block-pro-copy-button{padding:0!important}.wp-block-kevinbatdorf-code-block-pro:hover .code-block-pro-copy-button{opacity:.5!important}.wp-block-kevinbatdorf-code-block-pro .code-block-pro-copy-button:hover{opacity:.9!important}.code-block-pro-copy-button[data-has-text-button],.wp-block-kevinbatdorf-code-block-pro:hover .code-block-pro-copy-button[data-has-text-button]{opacity:1!important}.wp-block-kevinbatdorf-code-block-pro .code-block-pro-copy-button[data-has-text-button]:hover{opacity:.8!important}.code-block-pro-copy-button[data-has-text-button]{border-radius:.75rem!important;display:block!important;margin-right:.75rem!important;margin-top:.7rem!important;padding:.125rem .375rem!important}.code-block-pro-copy-button[data-inside-header-type=headlightsMuted],.code-block-pro-copy-button[data-inside-header-type^=headlights]{margin-top:.85rem!important}.code-block-pro-copy-button[data-inside-header-type=headlightsMutedAlt]{margin-top:.65rem!important}.code-block-pro-copy-button[data-inside-header-type=simpleString]{margin-top:.645rem!important}.code-block-pro-copy-button[data-inside-header-type=pillString]{margin-top:1rem!important}.code-block-pro-copy-button[data-inside-header-type=pillString] .cbp-btn-text{position:relative!important;top:1px!important}.cbp-btn-text{font-size:.75rem!important;line-height:1rem!important}.code-block-pro-copy-button .without-check{display:block!important}.code-block-pro-copy-button .with-check{display:none!important}.code-block-pro-copy-button.cbp-copying{opacity:1!important}.code-block-pro-copy-button.cbp-copying .without-check{display:none!important}.code-block-pro-copy-button.cbp-copying .with-check{display:block!important}.cbp-footer-link:hover{text-decoration-line:underline!important}@media print{.wp-block-kevinbatdorf-code-block-pro pre{max-height:none!important}.wp-block-kevinbatdorf-code-block-pro:not(#x) .line:before{background-color:transparent!important;color:inherit!important}.wp-block-kevinbatdorf-code-block-pro:not(#x) .cbp-line-highlighter,.wp-block-kevinbatdorf-code-block-pro:not(#x)>span{display:none!important}}
</style>
<style id="classic-theme-styles-inline-css">
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id="global-styles-inline-css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #1a1a1a;--wp--preset--color--medium-gray: #686868;--wp--preset--color--light-gray: #e5e5e5;--wp--preset--color--blue-gray: #4d545c;--wp--preset--color--bright-blue: #007acc;--wp--preset--color--light-blue: #9adffd;--wp--preset--color--dark-brown: #402b30;--wp--preset--color--medium-brown: #774e24;--wp--preset--color--dark-red: #640c1f;--wp--preset--color--bright-red: #ff675f;--wp--preset--color--yellow: #ffef8e;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
</style>
<link rel="stylesheet" id="twentysixteen-fonts-css" href="https://cloudydatablog.net/wp-content/themes/twentysixteen/fonts/merriweather-plus-montserrat-plus-inconsolata.css?ver=20230328" media="all">
<link rel="stylesheet" id="genericons-css" href="https://cloudydatablog.net/wp-content/themes/twentysixteen/genericons/genericons.css?ver=20201208" media="all">
<link rel="stylesheet" id="twentysixteen-style-css" href="https://cloudydatablog.net/wp-content/themes/twentysixteen/style.css?ver=20241112" media="all">
<style id="twentysixteen-style-inline-css">
/* Color Scheme */
/* Background Color */
body {
background-color: #616a73;
}
/* Page Background Color */
.site {
background-color: #4d545c;
}
mark,
ins,
button,
button[disabled]:hover,
button[disabled]:focus,
input[type="button"],
input[type="button"][disabled]:hover,
input[type="button"][disabled]:focus,
input[type="reset"],
input[type="reset"][disabled]:hover,
input[type="reset"][disabled]:focus,
input[type="submit"],
input[type="submit"][disabled]:hover,
input[type="submit"][disabled]:focus,
.menu-toggle.toggled-on,
.menu-toggle.toggled-on:hover,
.menu-toggle.toggled-on:focus,
.pagination .prev,
.pagination .next,
.pagination .prev:hover,
.pagination .prev:focus,
.pagination .next:hover,
.pagination .next:focus,
.pagination .nav-links:before,
.pagination .nav-links:after,
.widget_calendar tbody a,
.widget_calendar tbody a:hover,
.widget_calendar tbody a:focus,
.page-links a,
.page-links a:hover,
.page-links a:focus {
color: #4d545c;
}
/* Link Color */
.menu-toggle:hover,
.menu-toggle:focus,
a,
.main-navigation a:hover,
.main-navigation a:focus,
.dropdown-toggle:hover,
.dropdown-toggle:focus,
.social-navigation a:hover:before,
.social-navigation a:focus:before,
.post-navigation a:hover .post-title,
.post-navigation a:focus .post-title,
.tagcloud a:hover,
.tagcloud a:focus,
.site-branding .site-title a:hover,
.site-branding .site-title a:focus,
.entry-title a:hover,
.entry-title a:focus,
.entry-footer a:hover,
.entry-footer a:focus,
.comment-metadata a:hover,
.comment-metadata a:focus,
.pingback .comment-edit-link:hover,
.pingback .comment-edit-link:focus,
.comment-reply-link,
.comment-reply-link:hover,
.comment-reply-link:focus,
.required,
.site-info a:hover,
.site-info a:focus {
color: #c7c7c7;
}
mark,
ins,
button:hover,
button:focus,
input[type="button"]:hover,
input[type="button"]:focus,
input[type="reset"]:hover,
input[type="reset"]:focus,
input[type="submit"]:hover,
input[type="submit"]:focus,
.pagination .prev:hover,
.pagination .prev:focus,
.pagination .next:hover,
.pagination .next:focus,
.widget_calendar tbody a,
.page-links a:hover,
.page-links a:focus {
background-color: #c7c7c7;
}
input[type="date"]:focus,
input[type="time"]:focus,
input[type="datetime-local"]:focus,
input[type="week"]:focus,
input[type="month"]:focus,
input[type="text"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="password"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="number"]:focus,
textarea:focus,
.tagcloud a:hover,
.tagcloud a:focus,
.menu-toggle:hover,
.menu-toggle:focus {
border-color: #c7c7c7;
}
/* Main Text Color */
body,
blockquote cite,
blockquote small,
.main-navigation a,
.menu-toggle,
.dropdown-toggle,
.social-navigation a,
.post-navigation a,
.pagination a:hover,
.pagination a:focus,
.widget-title a,
.site-branding .site-title a,
.entry-title a,
.page-links > .page-links-title,
.comment-author,
.comment-reply-title small a:hover,
.comment-reply-title small a:focus {
color: #f2f2f2;
}
blockquote,
.menu-toggle.toggled-on,
.menu-toggle.toggled-on:hover,
.menu-toggle.toggled-on:focus,
.post-navigation,
.post-navigation div + div,
.pagination,
.widget,
.page-header,
.page-links a,
.comments-title,
.comment-reply-title {
border-color: #f2f2f2;
}
button,
button[disabled]:hover,
button[disabled]:focus,
input[type="button"],
input[type="button"][disabled]:hover,
input[type="button"][disabled]:focus,
input[type="reset"],
input[type="reset"][disabled]:hover,
input[type="reset"][disabled]:focus,
input[type="submit"],
input[type="submit"][disabled]:hover,
input[type="submit"][disabled]:focus,
.menu-toggle.toggled-on,
.menu-toggle.toggled-on:hover,
.menu-toggle.toggled-on:focus,
.pagination:before,
.pagination:after,
.pagination .prev,
.pagination .next,
.page-links a {
background-color: #f2f2f2;
}
/* Secondary Text Color */
/**
* IE8 and earlier will drop any block with CSS3 selectors.
* Do not combine these styles with the next block.
*/
body:not(.search-results) .entry-summary {
color: #f2f2f2;
}
blockquote,
.post-password-form label,
a:hover,
a:focus,
a:active,
.post-navigation .meta-nav,
.image-navigation,
.comment-navigation,
.widget_recent_entries .post-date,
.widget_rss .rss-date,
.widget_rss cite,
.site-description,
.author-bio,
.entry-footer,
.entry-footer a,
.sticky-post,
.taxonomy-description,
.entry-caption,
.comment-metadata,
.pingback .edit-link,
.comment-metadata a,
.pingback .comment-edit-link,
.comment-form label,
.comment-notes,
.comment-awaiting-moderation,
.logged-in-as,
.form-allowed-tags,
.site-info,
.site-info a,
.wp-caption .wp-caption-text,
.gallery-caption,
.widecolumn label,
.widecolumn .mu_register label {
color: #f2f2f2;
}
.widget_calendar tbody a:hover,
.widget_calendar tbody a:focus {
background-color: #f2f2f2;
}
/* Border Color */
fieldset,
pre,
abbr,
acronym,
table,
th,
td,
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="week"],
input[type="month"],
input[type="text"],
input[type="email"],
input[type="url"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="number"],
textarea,
.main-navigation li,
.main-navigation .primary-menu,
.menu-toggle,
.dropdown-toggle:after,
.social-navigation a,
.image-navigation,
.comment-navigation,
.tagcloud a,
.entry-content,
.entry-summary,
.page-links a,
.page-links > span,
.comment-list article,
.comment-list .pingback,
.comment-list .trackback,
.comment-reply-link,
.no-comments,
.widecolumn .mu_register .mu_alert {
border-color: #f2f2f2; /* Fallback for IE7 and IE8 */
border-color: rgba( 242, 242, 242, 0.2);
}
hr,
code {
background-color: #f2f2f2; /* Fallback for IE7 and IE8 */
background-color: rgba( 242, 242, 242, 0.2);
}
@media screen and (min-width: 56.875em) {
.main-navigation li:hover > a,
.main-navigation li.focus > a {
color: #c7c7c7;
}
.main-navigation ul ul,
.main-navigation ul ul li {
border-color: rgba( 242, 242, 242, 0.2);
}
.main-navigation ul ul:before {
border-top-color: rgba( 242, 242, 242, 0.2);
border-bottom-color: rgba( 242, 242, 242, 0.2);
}
.main-navigation ul ul li {
background-color: #4d545c;
}
.main-navigation ul ul:after {
border-top-color: #4d545c;
border-bottom-color: #4d545c;
}
}
</style>
<link rel="stylesheet" id="twentysixteen-block-style-css" href="https://cloudydatablog.net/wp-content/themes/twentysixteen/css/blocks.css?ver=20240817" media="all">
<!--[if lt IE 10]>
<link rel='stylesheet' id='twentysixteen-ie-css' href='https://cloudydatablog.net/wp-content/themes/twentysixteen/css/ie.css?ver=20170530' media='all' />
<![endif]-->
<!--[if lt IE 9]>
<link rel='stylesheet' id='twentysixteen-ie8-css' href='https://cloudydatablog.net/wp-content/themes/twentysixteen/css/ie8.css?ver=20170530' media='all' />
<![endif]-->
<!--[if lt IE 8]>
<link rel='stylesheet' id='twentysixteen-ie7-css' href='https://cloudydatablog.net/wp-content/themes/twentysixteen/css/ie7.css?ver=20170530' media='all' />
<![endif]-->
<!--[if lt IE 9]>
<script src="https://cloudydatablog.net/wp-content/themes/twentysixteen/js/html5.js?ver=3.7.3" id="twentysixteen-html5-js"></script>
<![endif]-->
<script src="https://cloudydatablog.net/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script src="https://cloudydatablog.net/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<script id="twentysixteen-script-js-extra">
var screenReaderText = {"expand":"expand child menu","collapse":"collapse child menu"};
</script>
<script src="https://cloudydatablog.net/wp-content/themes/twentysixteen/js/functions.js?ver=20230629" id="twentysixteen-script-js" defer="" data-wp-strategy="defer"></script>
<!-- Google tag (gtag.js) snippet added by Site Kit -->
<!-- Google Analytics snippet added by Site Kit -->
<script src="https://www.googletagmanager.com/gtag/js?id=GT-KVHJNH6" id="google_gtagjs-js" async=""></script>
<script id="google_gtagjs-js-after">
window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
gtag("set","linker",{"domains":["cloudydatablog.net"]});
gtag("js", new Date());
gtag("set", "developer_id.dZTNiMT", true);
gtag("config", "GT-KVHJNH6");
</script>
<!-- End Google tag (gtag.js) snippet added by Site Kit -->
<link rel="https://api.w.org/" href="https://cloudydatablog.net/wp-json/"><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://cloudydatablog.net/xmlrpc.php?rsd">
<meta name="generator" content="WordPress 6.7.1">
<meta name="generator" content="Site Kit by Google 1.140.0"><style type="text/css">.broken_link, a.broken_link {
text-decoration: line-through;
}</style><style id="custom-background-css">
body.custom-background { background-color: #2f5272; }
</style>
<link rel="icon" href="https://cloudydatablog.net/wp-content/uploads/2022/11/cropped-bitmap-32x32.png" sizes="32x32">
<link rel="icon" href="https://cloudydatablog.net/wp-content/uploads/2022/11/cropped-bitmap-192x192.png" sizes="192x192">
<link rel="apple-touch-icon" href="https://cloudydatablog.net/wp-content/uploads/2022/11/cropped-bitmap-180x180.png">
<meta name="msapplication-TileImage" content="https://cloudydatablog.net/wp-content/uploads/2022/11/cropped-bitmap-270x270.png">
<link rel="stylesheet" type="text/css" href="https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b"><link rel="stylesheet" type="text/css" href="https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?ver=3.0.9b"><script src="https://cloudydatablog.net/wp-includes/js/wp-emoji-release.min.js?ver=6.7.1" defer=""></script></head>
<body class="home blog custom-background wp-embed-responsive group-blog hfeed">
<div id="page" class="site">
<div class="site-inner">
<a class="skip-link screen-reader-text" href="#content">
Skip to content </a>
<header id="masthead" class="site-header">
<div class="site-header-main">
<div class="site-branding">
<h1 class="site-title"><a href="https://cloudydatablog.net/" rel="home">Cloudy DATA Blog</a></h1>
<p class="site-description">Technical ramblings | Mark Brooks</p>
</div><!-- .site-branding -->
<button id="menu-toggle" class="menu-toggle" aria-expanded="false" aria-controls="site-navigation social-navigation">Menu</button>
<div id="site-header-menu" class="site-header-menu">
<nav id="site-navigation" class="main-navigation" aria-label="Primary menu" aria-expanded="false">
<div class="menu-main-menu-container"><ul id="menu-main-menu" class="primary-menu"><li id="menu-item-2244" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-2244"><a href="https://cloudydatablog.net" aria-current="page">Home</a></li>
<li id="menu-item-3776" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3776" aria-haspopup="true"><a href="https://cloudydatablog.net/category/mariadb/">MariaDB</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li id="menu-item-3780" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3780"><a href="https://cloudydatablog.net/category/mariadb/">MariaDB</a></li>
<li id="menu-item-3781" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3781"><a href="https://cloudydatablog.net/category/mysql/">MySQL</a></li>
<li id="menu-item-3783" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3783"><a href="https://cloudydatablog.net/category/phpmyadmin/">phpmyadmin</a></li>
</ul>
</li>
<li id="menu-item-3772" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3772" aria-haspopup="true"><a href="https://cloudydatablog.net/category/ms-access/">MS Access</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li id="menu-item-3778" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3778"><a href="https://cloudydatablog.net/category/ms-access/">MS Access</a></li>
<li id="menu-item-3768" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3768"><a href="https://cloudydatablog.net/category/vba-code/">VBA Code MS Access</a></li>
</ul>
</li>
<li id="menu-item-3773" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3773" aria-haspopup="true"><a href="https://cloudydatablog.net/category/postgres/">Postgres</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li id="menu-item-3779" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3779"><a href="https://cloudydatablog.net/category/postgres/">Postgres</a></li>
<li id="menu-item-3774" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3774"><a href="https://cloudydatablog.net/category/postgis/">PostGIS</a></li>
<li id="menu-item-3782" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3782"><a href="https://cloudydatablog.net/category/pgrouting/">pgrouting</a></li>
<li id="menu-item-3784" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3784"><a href="https://cloudydatablog.net/category/psql/">psql</a></li>
</ul>
</li>
<li id="menu-item-3771" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3771" aria-haspopup="true"><a href="https://cloudydatablog.net/category/sql-server/">SQL Server</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li id="menu-item-3767" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3767"><a href="https://cloudydatablog.net/category/sql-azure/">SQL Azure</a></li>
<li id="menu-item-3793" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3793"><a href="https://cloudydatablog.net/category/sql-server/">SQL Server</a></li>
<li id="menu-item-3770" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3770"><a href="https://cloudydatablog.net/category/ssms/">SSMS</a></li>
<li id="menu-item-3769" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3769"><a href="https://cloudydatablog.net/category/tsql-scripts/">TSQL scripts</a></li>
<li id="menu-item-3775" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3775"><a href="https://cloudydatablog.net/category/tsql-user-defined-function/">TSQL User Defined Function</a></li>
</ul>
</li>
<li id="menu-item-2258" class="menu-item menu-item-type-post_type menu-item-object-post menu-item-2258"><a href="https://cloudydatablog.net/search/">Search</a></li>
<li id="menu-item-2257" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2257" aria-haspopup="true"><a href="https://cloudydatablog.net/sample-page/">About Me</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li id="menu-item-3777" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3777"><a href="https://cloudydatablog.net/sample-page/">About Me</a></li>
<li id="menu-item-2251" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2251"><a href="https://cloudydatablog.net/photo/">Photos</a></li>
<li id="menu-item-2726" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2726"><a href="https://cloudydatablog.net/useful-links/">Useful Links</a></li>
</ul>
</li>
</ul></div> </nav><!-- .main-navigation -->
</div><!-- .site-header-menu -->
</div><!-- .site-header-main -->
<div class="header-image">
<a href="https://cloudydatablog.net/" rel="home">
<img src="https://cloudydatablog.net/wp-content/uploads/2021/02/Capture.png" width="622" height="122" alt="Cloudy DATA Blog" sizes="(max-width: 709px) 85vw, (max-width: 909px) 81vw, (max-width: 1362px) 88vw, 1200px" srcset="https://cloudydatablog.net/wp-content/uploads/2021/02/Capture.png 622w, https://cloudydatablog.net/wp-content/uploads/2021/02/Capture-300x59.png 300w" decoding="async" fetchpriority="high"> </a>
</div><!-- .header-image -->
</header><!-- .site-header -->
<div id="content" class="site-content">
<div id="primary" class="content-area">
<main id="main" class="site-main">
<article id="post-4640" class="post-4640 post type-post status-publish format-standard has-post-thumbnail hentry category-all category-postgis category-postgres category-psql">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/postgres-alter-default-database/" rel="bookmark">Postgres : Adjust default Database to inherit PostGIS and pgRouting on CREATE</a></h2> </header><!-- .entry-header -->
<a class="post-thumbnail" href="https://cloudydatablog.net/postgres-alter-default-database/" aria-hidden="true">
<img width="730" height="568" src="https://cloudydatablog.net/wp-content/uploads/2024/10/Capture.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Postgres : Adjust default Database to inherit PostGIS and pgRouting on CREATE" decoding="async" srcset="https://cloudydatablog.net/wp-content/uploads/2024/10/Capture.png 730w, https://cloudydatablog.net/wp-content/uploads/2024/10/Capture-300x233.png 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 60vw, (max-width: 1362px) 62vw, 840px"> </a>
<div class="entry-content">
<p>In Postgres when an administrator creates a database in the background Postgres is copying a template database.<br>
As default the new database is a copy of a database that is created at install called <strong>template1</strong>. This database is usually hidden and even if you are logged in as the Postgres superuser this database is not listed when you search on the server for all available database.</p>
<p>Normally an administrator that is limited to dbcreator rights does NOT have rights to install extensions. This is particularly an issue when dealing with geography administrators that need to create databases with PostGIS and pgrouting extensions but you don’t want to elevate these administrators to superusers.</p>
<p>Superuser administrators can however install these extensions on the template database which means that when an administrator with dbcreator rights logins in and runs the create database command the new database created will inherit the extensions postgis and pgrouting (and any other extensions you add to template1).</p>
<p>Steps to Alter template1:<br>
Connect to the PostgreSQL Instance as a Superuser:</p>
<p>Use a superuser account (e.g., postgres) to connect to the PostgreSQL instance.</p>
<p>Allow template1 to be modified:</p>
<p>By default, the template databases are marked as “databases not allowed for connection.” You need to change this setting temporarily.</p>
<div><div id="highlighter_146431" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">ALTER</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">template1 IS_TEMPLATE = </code><code class="sql keyword">false</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>Connect to template1:</p>
<p>Now, connect to the template1 database.</p>
<div><div id="highlighter_80631" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">\c template1</code></div></div></td></tr></tbody></table></div></div>
<p>Install the PostGIS and pgRouting Extensions in template1:</p>
<p>Once connected to template1, install the extensions:</p>
<div><div id="highlighter_281102" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql plain">EXTENSION postgis;</code></div><div class="line number2 index1 alt1"><code class="sql keyword">CREATE</code> <code class="sql plain">EXTENSION pgrouting;</code></div></div></td></tr></tbody></table></div></div>
<p>Restore template1 to be a template database:</p>
<p>After installing the extensions, you need to restore template1 as a template:</p>
<div><div id="highlighter_59653" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">ALTER</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">template1 IS_TEMPLATE = </code><code class="sql keyword">true</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>Prevent Modifications to template1 (Optional):</p>
<p>To prevent accidental changes to template1 in the future, you can revoke connection permissions:</p>
<div><div id="highlighter_442017" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">REVOKE</code> <code class="sql keyword">CONNECT</code> <code class="sql keyword">ON</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">template1 </code><code class="sql keyword">FROM</code> <code class="sql keyword">public</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>Future Databases Will Inherit PostGIS and pgRouting:<br>
Now, whenever a new database is created using the template1 template, it will automatically inherit the PostGIS and pgRouting extensions:</p>
<div><div id="highlighter_613715" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">new_database_name;</code></div></div></td></tr></tbody></table></div></div>
<p>— This new database will have PostGIS and pgRouting installed.</p>
<p>Caution:<br>
Modifying the default template1 means all databases created in the future will have the extensions, which might not be ideal if you don’t want PostGIS or pgRouting in every database. You could alternatively create a custom template and specify it when creating spatial databases.</p>
<p>Example of creating a custom template:</p>
<div><div id="highlighter_791611" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">template_postgis TEMPLATE template1;</code></div><div class="line number2 index1 alt1"><code class="sql plain">\c template_postgis</code></div><div class="line number3 index2 alt2"><code class="sql keyword">CREATE</code> <code class="sql plain">EXTENSION postgis;</code></div><div class="line number4 index3 alt1"><code class="sql keyword">CREATE</code> <code class="sql plain">EXTENSION pgrouting;</code></div><div class="line number5 index4 alt2"><code class="sql keyword">ALTER</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">template_postgis IS_TEMPLATE = </code><code class="sql keyword">true</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>This way, you can create new spatial databases by specifying this custom template:</p>
<div><div id="highlighter_162744" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">DATABASE</code> <code class="sql plain">spatial_db TEMPLATE template_postgis;</code></div></div></td></tr></tbody></table></div></div>
<p>This approach provides more control over which databases include the extensions.</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/postgres-alter-default-database/" rel="bookmark"><time class="entry-date published" datetime="2024-10-16T15:58:57+01:00">16/10/2024</time><time class="updated" datetime="2024-10-16T17:32:48+01:00">16/10/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/postgis/" rel="category tag">PostGIS</a>, <a href="https://cloudydatablog.net/category/postgres/" rel="category tag">Postgres</a>, <a href="https://cloudydatablog.net/category/psql/" rel="category tag">psql</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4640 -->
<article id="post-4610" class="post-4610 post type-post status-publish format-standard hentry category-all category-geographical-information-systems category-geoserver">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/geoserver-create-view/" rel="bookmark">Geoserver – CREATE View</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Geoserver has this really great feature whereby admins are able to create views that are held with the configuration of the Geoserver but separate from the database. This allows admins the ability to create views WITHOUT the need to have database admin rights on the server. This is particularly useful where you have an onsite vendor database that you would not otherwise be allowed to write views in but nonetheless you require some way to store spatially enabled views .</p>
<p>Quick setup guide how to do this.</p>
<p>Firstly go to layers and hit<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture.png" alt="" width="317" height="89" class="aligncenter size-full wp-image-4611" srcset="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture.png 317w, https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-300x84.png 300w" sizes="auto, (max-width: 317px) 85vw, 317px"></a></p>
<p>Select the Store that you are interested in</p>
<p>Next you should see text and just hit it.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-1.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-1.png" alt="" width="675" height="161" class="aligncenter size-full wp-image-4612" srcset="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-1.png 675w, https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-1-300x72.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Then there will be a place where you can put the SQL Statement in.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2.png" alt="" width="1088" height="679" class="aligncenter size-full wp-image-4615" srcset="https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2.png 1088w, https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2-300x187.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2-1024x639.png 1024w, https://cloudydatablog.net/wp-content/uploads/2024/07/Capture-2-768x479.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/geoserver-create-view/" rel="bookmark"><time class="entry-date published" datetime="2024-07-01T17:12:03+01:00">01/07/2024</time><time class="updated" datetime="2024-07-01T17:21:37+01:00">01/07/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/geographical-information-systems/" rel="category tag">Geographical Information Systems</a>, <a href="https://cloudydatablog.net/category/geoserver/" rel="category tag">Geoserver</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4610 -->
<article id="post-4597" class="post-4597 post type-post status-publish format-standard hentry category-all category-database-design category-dev-ops category-postgis category-postgres category-psql">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/postgres-create-table-syntax-best-practice/" rel="bookmark">Postgres : Create Table SQL Syntax Best Practice</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>For primary keys it is now the recommendation to use identity during table creation.</p>
<p>Apparently it explicitly conveys the purpose of the column and aligns with SQL standards thus it is important to use when possible rather than the former serial command. In theory this should be more portable as well.</p>
<p>Depending on what source you read you may or may not need the following extension to create UUIDs – I needed it but I am told it should be in the main library.</p>
<div><div id="highlighter_497159" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql plain">EXTENSION IF </code><code class="sql color1">NOT</code> <code class="sql plain">EXISTS pgcrypto </code><code class="sql keyword">WITH</code> <code class="sql keyword">SCHEMA</code> <code class="sql keyword">public</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>So here is standard code for creating a table with three columns</p>
<div><div id="highlighter_716326" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TABLE</code> <code class="sql plain">t001example </code></div><div class="line number2 index1 alt1"><code class="sql plain">(</code></div><div class="line number3 index2 alt2"><code class="sql plain">pkid </code><code class="sql keyword">bigint</code> <code class="sql plain">GENERATED ALWAYS </code><code class="sql keyword">AS</code> <code class="sql plain">IDENTITY </code><code class="sql keyword">PRIMARY</code> <code class="sql keyword">KEY</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql plain">genuuid uuid </code><code class="sql keyword">DEFAULT</code> <code class="sql plain">gen_random_uuid(),</code></div><div class="line number5 index4 alt2"><code class="sql plain">sitename </code><code class="sql keyword">varchar</code><code class="sql plain">(500)</code></div><div class="line number6 index5 alt1"><code class="sql plain">);</code></div></div></td></tr></tbody></table></div></div>
<p>And these are example values<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-2.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-2.png" alt="" width="681" height="122" class="aligncenter size-full wp-image-4603" srcset="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-2.png 681w, https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-2-300x54.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/postgres-create-table-syntax-best-practice/" rel="bookmark"><time class="entry-date published" datetime="2024-06-27T13:35:34+01:00">27/06/2024</time><time class="updated" datetime="2024-06-27T13:49:22+01:00">27/06/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/database-design/" rel="category tag">Database Design</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a>, <a href="https://cloudydatablog.net/category/postgis/" rel="category tag">PostGIS</a>, <a href="https://cloudydatablog.net/category/postgres/" rel="category tag">Postgres</a>, <a href="https://cloudydatablog.net/category/psql/" rel="category tag">psql</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4597 -->
<article id="post-4569" class="post-4569 post type-post status-publish format-standard hentry category-all category-cpanel category-dev-ops">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/cpanel-just-gets-better-and-better/" rel="bookmark">cPanel – Just gets better and better</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2.jpeg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2.jpeg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4576" srcset="https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2.jpeg 1024w, https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2-300x300.jpeg 300w, https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2-150x150.jpeg 150w, https://cloudydatablog.net/wp-content/uploads/2024/05/cpanelguitar2-768x768.jpeg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Good self service Web Hosting Management software is just a game changer for Dev Ops work.</p>
<p>Every year I learn a bit more and every year they probably improve it a bit more. I am really very far off the cutting edge so I can’t speak to cutting edge improvements of the whole platform but I can talk to the options that I am continually learning.</p>
<li>Being able to quickly create, manage and backup additonal wordpress sites for zero cost</li>
<li>Being able to quickly create, manage and backup additional mysql databases for zero cost</li>
<li>Being able to host additional CRUD applications for zero cost (with thanks to PHPRunner)</li>
<li>Being able to create and manage email addresses easily</li>
<p>.</p>
<p>AND NOW……</p>
<p>Being able to quickly manage the update PHP versions is just amazing…</p>
<p>cPanel:</p>
<p>Log into cPanel</p>
<li>Under Software click MultiPHP Manager</li>
<li>Make a note of of your current version on the domain</li>
<li>Select an updated version of PHP and click Apply</li>
<li>Visit your site to confirm that the change has not broken your site.</li>
<li>If the site is broken, you can switch back to the previous PHP version</li>
<p>.</p>
<p>Yes its that easy</p>
<p>Things I want next<br>
Front end cPanel at InMotion backend SQL Server in Azure<br>
Front end cPanel at InMotion backend Postgres Server in Azure<br>
Postgres backends in cPanel</p>
<p>cPanel rocks<br>
and so does PHP and PHPRunner<br>
and AI when it can learn to spell and count!<br>
(yes the picture annoys me as well)</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/cpanel-just-gets-better-and-better/" rel="bookmark"><time class="entry-date published" datetime="2024-05-26T09:36:32+01:00">26/05/2024</time><time class="updated" datetime="2024-05-26T11:40:10+01:00">26/05/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/cpanel/" rel="category tag">CPANEL</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4569 -->
<article id="post-4558" class="post-4558 post type-post status-publish format-standard hentry category-all category-dev-ops category-windows-10">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/device-name-quickest-ways-to-identify-on-windows-x64/" rel="bookmark">Device Name – Quickest ways to Identify on Windows x64</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Computing tries hard to obfuscate the device that is actually running the software that you are using. That is particularly the case with cloud computing and its particularly the case with web enabled software. Are you logging into the software that manages the database? or are you logging into the database itself?</p>
<p>Irrespective software gets installed on an individual machine and it is often important to know the name of that machine as that software might have its own username and password requirement and you need to know the username/password combination for the particular installation you are trying to access.</p>
<p>This is often confusing for database servers – increasingly I am trying to remember a broad map of what computers are where and what servers are where so I can at least reference them accurately.</p>
<p>Two ways to find the DEVICE NAME on a windows machine (there are others)</p>
<p>In the Windows Search bar type</p>
<div><div id="highlighter_386738" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">ABOUT</code></div></div></td></tr></tbody></table></div></div>
<p>or in the Windows Search bar type</p>
<div><div id="highlighter_964956" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">DEVICE MANAGER</code></div></div></td></tr></tbody></table></div></div>
<p>About will give you this<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/04/DeviceManager.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/04/DeviceManager.png" alt="" width="875" height="952" class="aligncenter size-full wp-image-4559" srcset="https://cloudydatablog.net/wp-content/uploads/2024/04/DeviceManager.png 875w, https://cloudydatablog.net/wp-content/uploads/2024/04/DeviceManager-276x300.png 276w, https://cloudydatablog.net/wp-content/uploads/2024/04/DeviceManager-768x836.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Device Manager will give you this<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/04/Capture.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/04/Capture.png" alt="" width="348" height="577" class="aligncenter size-full wp-image-4560" srcset="https://cloudydatablog.net/wp-content/uploads/2024/04/Capture.png 348w, https://cloudydatablog.net/wp-content/uploads/2024/04/Capture-181x300.png 181w" sizes="auto, (max-width: 348px) 85vw, 348px"></a></p>
<p>Note you can get to that About screen through file explorer by right clicking on this PC and selecting Properties – but it is slower than just typing about in the Windows Search box.</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/device-name-quickest-ways-to-identify-on-windows-x64/" rel="bookmark"><time class="entry-date published" datetime="2024-04-13T17:38:26+01:00">13/04/2024</time><time class="updated" datetime="2024-04-13T18:19:13+01:00">13/04/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a>, <a href="https://cloudydatablog.net/category/windows-10/" rel="category tag">Windows 10</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4558 -->
<article id="post-4588" class="post-4588 post type-post status-publish format-standard hentry category-all category-wordpress">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/10-years-of-writing-my-thoughts/" rel="bookmark">WP Handy plug in for counting your posts…</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>I knew I was coming up for 10 years(February 2024) writing on my site and I was curious to see what the entire body consisted of. There’s a handy wordcount plugin that will summarise everything.</p>
<p>“Dashboard Wordcount” – and here’s my stats for this site..</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-1.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-1.png" alt="" width="400" height="189" class="aligncenter size-full wp-image-4589" srcset="https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-1.png 400w, https://cloudydatablog.net/wp-content/uploads/2024/06/Capture-1-300x142.png 300w" sizes="auto, (max-width: 400px) 85vw, 400px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-9.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-9.png" alt="" width="926" height="181" class="aligncenter size-full wp-image-4595" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-9.png 926w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-9-300x59.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-9-768x150.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/10-years-of-writing-my-thoughts/" rel="bookmark"><time class="entry-date published" datetime="2024-03-25T12:29:43+00:00">25/03/2024</time><time class="updated" datetime="2024-06-25T16:01:48+01:00">25/06/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/wordpress/" rel="category tag">Wordpress</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4588 -->
<article id="post-4500" class="post-4500 post type-post status-publish format-standard hentry category-all category-dev-ops category-geographical-information-systems category-geoserver category-gis category-oracle category-rtpi-gis">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/geoserver-and-oracle-wfs-wms-config-tips/" rel="bookmark">GeoServer and ORACLE – WFS & WMS Config Tips</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4501" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.png" alt="" width="664" height="663" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.png 664w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-300x300.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-150x150.png 150w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>This post is a brief description of my findings on setting up Geoserver from scratch and some particular points on setting it up for an Oracle connection. I hope it will prove useful for others.</p>
<p><strong>INSTALLATION </strong><br>
<code>GeoServer with ORACLE database connection support</code><br>
Geoserver Postgres (PostGIS) connection support comes with the default installation. This is NOT the case for Oracle or SQL Server therefore for enterprise purposes it is a requirement to install Geoserver WITH Oracle and SQL Server extensions if you wish to support these database connections.</p>
<p>I’ve done a post on Geoserver on windows installation <a href="https://cloudydatablog.net/installation-and-configuration-of-geoserver-for-sql-azure-on-windows-should-work-for-any-sql-server-instance/" target="_blank" rel="noopener">link here</a> that talks specifically about SQL Server. I will not go into a lot of detail about installation here. See below for links to the geoserver docker image I didn’t install the geoserver I describe here but I can confirm that we have been successful in including Oracle as a plugin to our Geoserver installation and we are able to connect.</p>
<p><a href="https://github.com/geoserver/docker" target="_blank" rel="noopener">Official Geoserver Docker Image GITHUB</a></p>
<p>Below is a recent (Feb 2024) list of Docker parameters available at install including Oracle and SQL Server please seek advice on the use of Docker for installation if you are not familiar with it already.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4505" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.png" alt="" width="649" height="212" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.png 649w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1-300x98.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p><strong>GENERAL SETUP</strong></p>
<p><strong>Contact Information – General Setup</strong><br>
On the Welcome screen there is a line that reads For more information visit {organization} to change this from the initial meaningless variable setting go to Contact Information and fill out your organisation.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4507" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.png" alt="" width="908" height="412" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.png 908w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2-300x136.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2-768x348.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p><strong>Difference between Save and Apply – General point</strong></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4509" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4.png" alt="" width="209" height="50"></a></p>
<p>In geoserver admin there are a lot of pages where there is a Save and an Apply button. Most users initially at least find this confusing.</p>
<p>In GeoServer, the terms “Save” and “Apply” serve different purposes:</p>
<p><code>Save:</code><br>
When you click “Save”, it permanently stores the changes you’ve made to the configuration. These changes are saved in the GeoServer configuration files. , “Save” ensures that your modifications persist even after restarting GeoServer or rebooting the system. It’s like committing your changes to a version control system—it makes them permanent.<br>
<code>Apply:</code><br>
“Apply”, on the other hand, is more immediate. When you click “Apply”, it takes the current configuration (including any unsaved changes) and applies it dynamically. The applied changes take effect immediately without requiring a restart or permanent storage. Think of it as a temporary adjustment that affects the running instance of GeoServer but doesn’t alter the saved configuration. In summary, “Save” makes changes permanent, while “Apply” applies them immediately without saving them to the configuration files</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark.png" alt="" width="5000" height="650" class="aligncenter size-full wp-image-4540" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark.png 5000w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-300x39.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-1024x133.png 1024w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-768x100.png 768w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-1536x200.png 1536w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-2048x266.png 2048w, https://cloudydatablog.net/wp-content/uploads/2024/03/Oracle_logo_logotype_wordmark-1200x156.png 1200w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>The first thing you will want to do is determine if you can actually connect to your <code>ORACLE</code> database.</p>
<p>ORACLE required parameters for database connection. Before you continue make sure you have the following</p>
<p>ORACLE host name<br>
Port ORACLE database (default 1521)<br>
database name<br>
user – case sensitive<br>
password – case sensitive<br>
Geoserver installed with Oracle extension</p>
<p>It is good idea to get your DBA to setup a read only user if you are connecting to a database that is part of a vendor supplied product as you really should not be editing the database through anything except the vendor’s UI and Geoserver can be setup to allow edit of data. Geoserver has powerful security configuration included but conflicting settings can arise that may alter the intended security levels making it safer to enforce read only least privilege at the database level.</p>
<p><strong>ORACLE and Postgres – some SQL Differences</strong><br>
Please be aware Oracle databases are by default case sensitive but may convert SQL Strings to upper case when passed to Oracle. I believe this complies strictly with the SQL Standard.</p>
<p>Postgres classifies tables, columns views and other database objects as Identifiers. SQL Identifiers must begin with a letter. If possible avoid including special characters in the naming of identifiers because although postgres may support them special characters are not allowed in the SQL Standard so their use might render applications less portable. Additional identifiers and keyword must begin with a letter. Keywords are defined as items such as SELECT / UPDATE / CREATE etc.. The SQL Standard says that databases should not define a key word that contains a digit or starts or ends with an underscore so identifiers could be something like t001users should be safe against possible conflict with future extensions of the standard. In postgres the maximum identifier length is 63 bytes. Additionally Postgres also folds unquoted names to lower case but some postgres management UIs allow for the naming of identifiers with varied case.</p>
<p>UPSHOT for Geoserver (and anything else for that matter)</p>
<p>If you are having difficulty referencing tables or views in any enterprise database – experiment with the case sensitivity in the query. There might be some folding of object names when passed to the server.<br>
This characteristic should be born in mind when using SQL Views in Geoserver.</p>
<p><strong>ORACLE Store setup to get the most out of Geoserver</strong><br>
Login to Geoserver admin panel using your admin account</p>
<p>On the left hand side under Data hit Stores</p>
<p>Assuming you have successfully installed Geoserver with the Oracle extension you should be presented with the following dialog and in particular the items highlighted below.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4513" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.png" alt="" width="810" height="322" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.png 810w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5-300x119.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5-768x305.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Oracle NG uses a standard Oracle driver (ignore the other options this article will not explain them)</p>
<p>Select <code>Oracle NG</code></p>
<p>Use the default settings for most things but IMPORTANTLY ensure Expose Primary Keys is ticked</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4515" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.png" alt="" width="289" height="552" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.png 289w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6-157x300.png 157w" sizes="auto, (max-width: 289px) 85vw, 289px"></a></p>
<p>NOTE from our brief testing we found that exposing primary keys seemed to be one factor that improved stability in our Oracle connection when dealing with QGIS.</p>
<p><strong>QGIS WFS set up to improve Oracle Connection Stability</strong><br>
It is recommended that you have a copy of QGIS to test setup to things like WFS</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-7.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4518" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-7.png" alt="" width="491" height="240" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-7.png 491w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-7-300x147.png 300w" sizes="auto, (max-width: 491px) 85vw, 491px"></a></p>
<p>When we first started displaying specifically the Oracle spatially enabled table in QGIS via WFS service we found that the layer would initially display but if we were to leave the project and go back in for a period of time the layer would not be visible. This seemed to be temporary and after an unpredictable amount of time the layer would reappear. The attribute table continued to be viewable but polygons were not visible.</p>
<p>We fixed this by ensuring Expose Primary Key (see Geoserver layer configuration) was ticked and within QGIS within the WFS Connection Configuration ensure within the WFS options section that the version is set to match the linked WFS Service. This might not be necessary in all QGIS versions.</p>
<p><code>LAYER Config</code><br>
Useful background information (partly written by co-pilot)</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-8.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4522" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-8.png" alt="" width="593" height="562" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-8.png 593w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-8-300x284.png 300w" sizes="auto, (max-width: 593px) 85vw, 593px"></a></p>
<p><strong>Enabled and Advertised parameters – Layer Config</strong><br>
In GeoServer, the Enabled and Advertised checkboxes play distinct roles in layer configuration:</p>
<p><code>Enabled:</code><br>
When a layer is enabled, it means that the layer is available for requests (such as WMS GetMap or WMS GetFeature). If a layer is not enabled, it won’t be accessible for any kind of request. However, it will still appear in the configuration (and in the REST config). Essentially, enabling a layer makes it operational and ready to serve data.<br>
<code>Advertised:</code><br>
By default, a layer is advertised. An advertised layer is included in the GetCapabilities request and appears in the layer preview. However, if you uncheck the Advertised checkbox, the layer will still be available for data access requests (like WMS), but it won’t appear in any capabilities documents or previews. In other words, non-advertised layers remain functional but are not explicitly listed in service metadata. Remember, enabling a layer makes it operational, while advertising it determines whether it appears in service capabilities and previews</p>
<p><strong>Name and Title parameters – Layer Config</strong><br>
<code>Name:</code><br>
The Name corresponds to the identifier used to reference the layer in WMS (Web Map Service) requests. It is primarily used for computer interaction and serves as an internal reference default name is usually the name of the table or the name of the referenced view. When creating a new layer for an already-published resource, the Name must be unique to avoid conflicts. Essentially, it’s the technical name associated with the layer.<br>
<code>Title:</code><br>
The Title provides a human-readable description that briefly identifies the layer to clients. Unlike the Name, which is for computers, the Title is meant for humans to read. It helps users understand the purpose or content of the layer. For example, if you have a layer representing a map of the USA, you might set the Title to “This is a map of USA.” Remember, while the Name is essential for system functionality, the Title enhances user experience by providing meaningful context about the layer1</p>
<p>Security – the Name does not need to be the table or view name you are referencing. This string appears in the URL which may be viewable to the user – you may wish to obfuscate this by changing the name</p>
<p><strong>i18n – Internalization – Layer Config</strong><br>
<code>Internationalization (i18n):</code><br>
GeoServer supports returning a GetCapabilities document (used for describing available services and layers) in various languages. The i18n functionality is available for the following services:<br>
WMS 1.1 and 1.3<br>
WFS 2.0<br>
WCS 2.0<br>
The i18n editor allows you to provide translations for the title and abstract of various components:<br>
Layers configuration page<br>
Layergroups configuration page<br>
WMS, WFS, and WCS service configuration pages<br>
Additionally, for Styles, there’s a separate i18n configuration (see i18N in SLD).By default, the i18n editor is disabled and can be enabled via the i18n checkbox.</p>
<p>GetCapabilities Document Language:<br>
The language of the GetCapabilities document can be selected using the AcceptLanguages request parameter.GeoServer’s response varies based on the following rules:<br>
Internationalized elements include titles, abstracts, and keywords.If a single language code is specified (e.g., AcceptLanguages=en), GeoServer tries to return content in that language.If multiple language codes are specified (e.g., AcceptLanguages=en,fr), GeoServer attempts to return content in one of the specified languages.</p>
<p><strong>Coordinate Reference Systems – Declared SRS and SRS handling – Layer Config</strong></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4528" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.jpg" alt="" width="505" height="152" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture.jpg 505w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-300x90.jpg 300w" sizes="auto, (max-width: 505px) 85vw, 505px"></a></p>
<p>If you are in the UK ensure that Declared SRS is set to 27700</p>
<p><strong>SRS Handling</strong><br>
In GeoServer, the SRS handling setting plays a crucial role in how coordinate reference systems (CRS) are managed. Let’s explore its significance:</p>
<p><code>Declared SRS:</code><br>
The Declared SRS specifies the coordinate system that GeoServer publishes to clients. It represents the CRS that clients should use when interacting with the layer. Essentially, it’s the officially declared CRS associated with the layer.<br>
<code>SRS Handling:</code><br>
The SRS Handling option determines how GeoServer should handle projection transformations when the declared CRS and the native CRS of the data differ. Here are the possible values for SRS Handling:<br>
Force declared (default): In this mode, GeoServer forces the declared SRS upon the data, overwriting the native CRS if necessary.<br>
Other options (not mentioned in the snippet):<br>
Reproject native to declared: GeoServer performs a reprojection from the native CRS to the declared CRS.<br>
Reproject declared to native: GeoServer reprojects from the declared CRS to the native CRS.<br>
None: No reprojection is performed; the data remains in its native CRS.<br>
In summary, the SRS handling setting ensures that data is presented consistently to clients, regardless of the underlying native CRS. It’s a critical aspect of maintaining accurate spatial information in GeoServer1.</p>
<p><strong>Bounding Box recommendations – Layer Config</strong><br>
Scotland</p>
<p>Min X = 010000<br>
Min Y = 533000</p>
<p>Max X = 464000<br>
Max Y = 1215000</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4530" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.jpg" alt="" width="427" height="195" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1.jpg 427w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-1-300x137.jpg 300w" sizes="auto, (max-width: 427px) 85vw, 427px"></a></p>
<p>West Lothian</p>
<p>Min X = 287000<br>
Min Y = 655000</p>
<p>Max X = 314000<br>
Max Y = 678000</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4531" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.jpg" alt="" width="442" height="203" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2.jpg 442w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-2-300x138.jpg 300w" sizes="auto, (max-width: 442px) 85vw, 442px"></a></p>
<p>UK<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-3.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4532" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-3.jpg" alt="" width="440" height="201" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-3.jpg 440w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-3-300x137.jpg 300w" sizes="auto, (max-width: 440px) 85vw, 440px"></a></p>
<p><strong>Workspace setup and visibility in WFS</strong><br>
Workspaces can allow for editing and not editing of information although to date I seem to be struggling to isolate layers and workspaces to allow them to be edited or not edited. One thing that is important in our present system is to Enable the settings in the Basic info – without this the layers within the workspace were not showing up in the WFS</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4533" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4.jpg" alt="" width="912" height="471" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4.jpg 912w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4-300x155.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-4-768x397.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Restrictions on Layers : Important Note</p>
<p>Important – Workspace Security settings override Layer Security Settings</p>
<p>If you need to have different layer security settings within one Workspace you will need to turn off all Workspace security settings e.g see below.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4535" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.jpg" alt="" width="899" height="339" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5.jpg 899w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5-300x113.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-5-768x290.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4536" src="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.jpg" alt="" width="835" height="387" srcset="https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6.jpg 835w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6-300x139.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/03/Capture-6-768x356.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/geoserver-and-oracle-wfs-wms-config-tips/" rel="bookmark"><time class="entry-date published" datetime="2024-03-01T19:28:16+00:00">01/03/2024</time><time class="updated" datetime="2024-03-28T09:07:27+00:00">28/03/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a>, <a href="https://cloudydatablog.net/category/geographical-information-systems/" rel="category tag">Geographical Information Systems</a>, <a href="https://cloudydatablog.net/category/geoserver/" rel="category tag">Geoserver</a>, <a href="https://cloudydatablog.net/category/gis/" rel="category tag">GIS</a>, <a href="https://cloudydatablog.net/category/oracle/" rel="category tag">ORACLE</a>, <a href="https://cloudydatablog.net/category/rtpi-gis/" rel="category tag">RTPI - GIS</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4500 -->
<article id="post-4348" class="post-4348 post type-post status-publish format-standard hentry category-all category-configuration category-dev-ops category-geographical-information-systems category-geoserver category-gis category-project-management category-qgis category-rtpi-gis">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/installation-and-configuration-of-geoserver-for-sql-azure-on-windows-should-work-for-any-sql-server-instance/" rel="bookmark">Geoserver Installation (Configuration for SQL Server on Windows)</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/GeoservertoSQLServerBanner.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/GeoservertoSQLServerBanner.jpg" alt="" width="909" height="533" class="aligncenter size-full wp-image-4412" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/GeoservertoSQLServerBanner.jpg 909w, https://cloudydatablog.net/wp-content/uploads/2024/01/GeoservertoSQLServerBanner-300x176.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/GeoservertoSQLServerBanner-768x450.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Once you have your data in an Enterprise Grade database sharing that information becomes important. Some vendors, in particular Digital mapping SAAS vendors want you to transfer your data into their clouds but for a lot of authorities that is categorically impossible for large segments of their data. For example about 3/4 of UK planning authorities run on software built by a company called IDOX Group plc which holds its data in Oracle this cannot be moved. For Geographical data here’s where Geoserver comes in.</p>
<p><a href="https://geoserver.org/" rel="noopener" target="_blank">Geoserver Official Website</a></p>
<p>From the website<br>
<em>GeoServer is an open source server for sharing geospatial data.<br>
Designed for interoperability, it publishes data from any major spatial data source using open standards.</em></p><em>
</em><p><em>GeoServer implements industry standard OGC protocols such as Web Feature Service (WFS), Web Map Service (WMS), and Web Coverage Service (WCS). Additional formats and publication options are available as extensions including Web Processing Service (WPS), and Web Map Tile Service (WMTS).</em></p>
<p>Another way of putting it Geoserver allows programs that display and manipulate geographic information to display and edit that data while keeping it safe and secure and located in enterprise databases. It can connect to SQL Server / Postgresql and I am told Oracle which are the main relational databases used by Local authorities today so once setup and configured it could be used to compare and contrast information in one location from variable datastores. Datastores that for historical reasons cannot be moved. Here I concentrate on SQL Server because we have a particular issue with new systems needing to connect to SQL Server but it would be great if we could get it working with Oracle as well.</p>
<p>The following are my notes on installation and configuration of Geoserver on Windows linking to SQL Server and in this case a remote(not on the same computer) SQL Azure instance I believe any remote SQL Server instance would be similar. This post is a detailed explanation of the installation of Geoserver locally on a laptop but I believe installation would be exactly the same on a Windows Server machine albeit additional steps would be required to publish to the web either internally or externally.</p>
<p>Its all configuration so remember your host names / IP numbers / ports / usernames / passwords / database, table and column names</p>
<p>To start this tutorial please ensure the following resources are available;</p>
<li>SSMS – installation of Sql Server Management Studio</li>
<li>SQL Azure instance with privileges to run SQL. Please note you will need to know the port number of your SQL server instance and have a Username and Password for your user.</li>
<li>Necessary privileges to set the firewall on the database which you will link to Geoserver –</li>
<li>QGIS – installation – If you don’t have a SQL Server instance with geodatabase already that you can use you will probably need this to add at least one record to a geometry enabled table I plan to expand my notes on this but at present you might be able to skip this</li>
<li>Geoserver 2.24.1 – installation files</li>
<li>Enough privileges on the computer you are installing geoserver to download installation files and move files into a library subdirectory of the c:/program file/geoserver directory</li>
<p>–</p>
<p><strong>WorkFlow Synopsis Overview</strong><br>
1)Download and install Java runtime engine (as above importantly here I use 11)<br>
2)Download and install Geoserver (2.24.1 in this case)<br>
3)Test that the Geoserver Admin dashboard is up and working<br>
4)Download and configure Geoserver Extension for SQL Server library (SQL Azure example)<br>
5)Good idea to setup a login specifically to your SQL Azure instance with least privilege – Your SQL Server instance with geodatabases may already have suitable logins. So steps 5 and 6 can be skipped<br>
6)Good idea to create an example table with Geodatabase in SQL Azure – will be used as a test connection table – NOTE if you already have a SQL Server with geodatabases you could use that instead.<br>
7)White list IP within the SQL Azure instance firewall rules to Geoserver computer<br>
8)Opening Geoserver and setting the ‘Store’ to reference your SQL Azure database using the login setup in step 5.<br>
9)Adding a new layer from the Store made in point 8 and seeing if you can Preview the layer – Ideally you should have a table that has some features in it. Setting the WMS and WFS up in Geoserver with sufficient rights to allow editing (if WFS setup)<br>
10)I don’t explain it in my post below but the next step would be to test in QGIS to see if you can setup a project in QGIS which can pull from Geoserver against a basemap and you check that the Polygons are actually where you want them to be.</p>
<p><strong>Workflow Detailed</strong><br>
<strong>1)Download the install Java Runtime via JDK</strong></p>
<p>There are some complications here<br>
Initially I tried to use the Java Runtime engine 17 and went through the complete Geoserver installation but on testing I was getting a Java error when trying to view layers. After a short google I came across a stack overflow thread that indicated that geoserver support for JDE 17 was experimental and I should use Java Runtime engine 11. Deinstallation of 17 and installation of 11 solved this.</p>
<p>Additionally there is the issue of where you obtain the Java Runtime installation from – there is the Adoptium location and then there is Oracle location. Oracle are making moves to charge for use of their Java Runtime engine so it is important that you use Adoptium resource to reduce costs.</p>
<p>Later I will list the url to the JDK download for Java Runtime engine but it is important to realise that Adoptium is a safe source, well supported and noted as open source.</p>
<p><a href="https://adoptium.net/en-GB/members/" rel="noopener" target="_blank">https://adoptium.net/en-GB/members/</a></p>
<p>so</p>
<p>Google Search for Adoptium<br>
<a href="https://adoptium.net/en-GB/" rel="noopener" target="_blank">https://adoptium.net/en-GB/</a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.jpg" alt="" width="528" height="546" class="aligncenter size-full wp-image-4354" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.jpg 528w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-290x300.jpg 290w" sizes="auto, (max-width: 528px) 85vw, 528px"></a></p>
<p>Navigate to other platforms and versions and target windows 64 bit JDK and 11 LTS version and download the .msi.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.jpg" alt="" width="1007" height="359" class="aligncenter size-full wp-image-4356" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.jpg 1007w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1-300x107.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1-768x274.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>After a short delay you will be shown the msi which will be in your downloads folder</p>
<p>Double click on it to install.</p>
<p>Now the only thing that is tricky here is to setup the java home directory as follows</p>
<p><a href="https://www.youtube.com/watch?v=JlLvyzuSyFU" rel="noopener" target="_blank">Video Installing Adoptium JDK on Windows</a></p>
<p>In particular note this section</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.jpg" alt="" width="598" height="468" class="aligncenter size-full wp-image-4357" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.jpg 598w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2-300x235.jpg 300w" sizes="auto, (max-width: 598px) 85vw, 598px"></a></p>
<p><strong>2) Download and install Geoserver</strong></p>
<p>Go to the official Geoserver web page and follow the links to download the windows installer</p>
<p>Here I use the windows version of Geoserver version 2.41.1 obtained January 2024 from the following url<br>
<a href="https://geoserver.org/" rel="noopener" target="_blank">Geoserver Official Website</a></p>
<p>See download button and then go to Windows Installer</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.jpg" alt="" width="841" height="551" class="aligncenter size-full wp-image-4358" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.jpg 841w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3-300x197.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3-768x503.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.jpg" alt="" width="789" height="475" class="aligncenter size-full wp-image-4360" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.jpg 789w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4-300x181.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4-768x462.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>I chose the left option and then I chose the Windows Installer option</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.png" alt="" width="994" height="630" class="aligncenter size-full wp-image-4361" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1.png 994w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1-300x190.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-1-768x487.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>This will download <code>Geoserver-2.24.1-winsetup.exe</code> to your download directory and you can then start the geoserver installation process</p>
<p>Next open up the executable and follow the instructions</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-5.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-5.jpg" alt="" width="514" height="400" class="aligncenter size-full wp-image-4362" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-5.jpg 514w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-5-300x233.jpg 300w" sizes="auto, (max-width: 514px) 85vw, 514px"></a></p>
<p>Next agree the licence<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-6.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-6.jpg" alt="" width="513" height="401" class="aligncenter size-full wp-image-4363" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-6.jpg 513w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-6-300x235.jpg 300w" sizes="auto, (max-width: 513px) 85vw, 513px"></a></p>
<p>Next we reference the java library installed in the previous step – if you have set the <code>java_home</code> variable correctly it should automatically find JRE 11 for you and it will place it within the path reference below. I don’t have a screenshot of the JRE 11 reference here as on my first installation I referenced the Oracle 17 JRE – (note I went back de-installed geoserver installed JRE 11 and then reinstalled geoserver to counter the proprietary Oracle runtime library and importantly to fix the issue that I was facing of geoserver not being compatible with JRE 17</p>
<p>The rest of the install from here is standard for a windows install</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-7.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-7.jpg" alt="" width="580" height="445" class="aligncenter size-full wp-image-4365" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-7.jpg 580w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-7-300x230.jpg 300w" sizes="auto, (max-width: 580px) 85vw, 580px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-8.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-8.jpg" alt="" width="562" height="427" class="aligncenter size-full wp-image-4367" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-8.jpg 562w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-8-300x228.jpg 300w" sizes="auto, (max-width: 562px) 85vw, 562px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-9.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-9.jpg" alt="" width="572" height="442" class="aligncenter size-full wp-image-4368" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-9.jpg 572w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-9-300x232.jpg 300w" sizes="auto, (max-width: 572px) 85vw, 572px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-10.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-10.jpg" alt="" width="591" height="449" class="aligncenter size-full wp-image-4369" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-10.jpg 591w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-10-300x228.jpg 300w" sizes="auto, (max-width: 591px) 85vw, 591px"></a></p>
<p>Next setup the default admin password – defaults are admin / geoserver</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-12.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-12.jpg" alt="" width="594" height="464" class="aligncenter size-full wp-image-4371" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-12.jpg 594w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-12-300x234.jpg 300w" sizes="auto, (max-width: 594px) 85vw, 594px"></a></p>
<p>Set up port geoserver runs on – default is 8080</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-13.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-13.jpg" alt="" width="581" height="450" class="aligncenter size-full wp-image-4372" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-13.jpg 581w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-13-300x232.jpg 300w" sizes="auto, (max-width: 581px) 85vw, 581px"></a></p>
<p>Next choose the execution type I like to install geoserver as a service</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-14.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-14.jpg" alt="" width="576" height="450" class="aligncenter size-full wp-image-4373" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-14.jpg 576w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-14-300x234.jpg 300w" sizes="auto, (max-width: 576px) 85vw, 576px"></a></p>
<p>Confirm your preferences and then trigger install</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-15.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-15.jpg" alt="" width="585" height="451" class="aligncenter size-full wp-image-4374" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-15.jpg 585w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-15-300x231.jpg 300w" sizes="auto, (max-width: 585px) 85vw, 585px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-16.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-16.jpg" alt="" width="581" height="461" class="aligncenter size-full wp-image-4375" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-16.jpg 581w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-16-300x238.jpg 300w" sizes="auto, (max-width: 581px) 85vw, 581px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-17.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-17.jpg" alt="" width="582" height="464" class="aligncenter size-full wp-image-4376" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-17.jpg 582w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-17-300x239.jpg 300w" sizes="auto, (max-width: 582px) 85vw, 582px"></a></p>
<p>Now you should see geoserver on your local machine as a service which you will need to ensure is running to access properly</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.png" alt="" width="596" height="318" class="aligncenter size-full wp-image-4377" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2.png 596w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-2-300x160.png 300w" sizes="auto, (max-width: 596px) 85vw, 596px"></a></p>
<p><strong>3) Test that Geoserver Admin dashboard is up and working at least locally</strong></p>
<p>If you have used the same settings as me open a browser and navigate to the following url</p>
<p><a href="https://localhost:8080/geoserver/web" rel="noopener" target="_blank">https://localhost:8080/geoserver/web</a></p>
<p>Login with the username and password which is usually admin / geoserver</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-18.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-18.jpg" alt="" width="597" height="351" class="aligncenter size-full wp-image-4378" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-18.jpg 597w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-18-300x176.jpg 300w" sizes="auto, (max-width: 597px) 85vw, 597px"></a></p>
<p>At which point you should see something similar to the following</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-19.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-19.jpg" alt="" width="596" height="358" class="aligncenter size-full wp-image-4379" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-19.jpg 596w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-19-300x180.jpg 300w" sizes="auto, (max-width: 596px) 85vw, 596px"></a></p>
<p><strong>4) Download and configure Geoserver Extension for SQL Server</strong></p>
<p>At install Geoserver comes with the ability to connect to Postgres but <strong>NOT</strong> SQL Server so we must install/configure plugin extension to enable Geoserver SQL Server connections.</p>
<p>Here we go back to the geoserver.org website and go to download but this time instead of choosing the windows installer we look to the Extensions section and choose <code>SQL Server</code></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.png" alt="" width="890" height="929" class="aligncenter size-full wp-image-4381" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3.png 890w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3-287x300.png 287w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-3-768x802.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>This should download geoserver-sqlserver extension plugin</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-20.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-20.jpg" alt="" width="857" height="296" class="aligncenter size-full wp-image-4382" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-20.jpg 857w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-20-300x104.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-20-768x265.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Next copy all files with the jar suffix into the following directory</p>
<p><code>C/program files/GeoServer/webapps/geoserver/WEb-Inf/Lib</code></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21.jpg" alt="" width="1298" height="334" class="aligncenter size-full wp-image-4383" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21.jpg 1298w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21-300x77.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21-1024x263.jpg 1024w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21-768x198.jpg 768w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-21-1200x309.jpg 1200w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Next restart the geoserver and go back to the local host and sign in</p>
<p><a href="http://localhost:8080/geoserver/web/?0" rel="noopener" target="_blank">http://localhost:8080/geoserver/web/?0</a></p>
<p>We are now very close to linking to SQL Server prior to that we must whitelist our geoserver so that your SQL Server instances will accept connections from your geoserver. Steps 5 and 6 are more about creating a user and ensuring you have a geodatabase with a georeferenced table skip to 7 if you want to read about white listing in SQL Azure or you have an alternative database that you could use with requirements already set up.</p>
<p><strong>5) Next its a good idea to create a user with least privilege this will be used to set up the link so go to SSMS</strong></p>
<p><a href="https://cloudydatablog.net/ms-azure-create-user-with-read-only-access-to-2-tables/" rel="noopener" target="_blank">Least privilege User Login Setup SQL Server</a></p>
<p>Here allow the amount of access you wish users to have remembering the principles of least privilege</p>
<p><strong>6) Lets create an example table with geometry that we will be connecting</strong><br>
When I first tried connecting to SQL Server (SQL Azure in my case) I didn’t have any georeferenced tables so I created one and added a few records. If you have a database already with tables with geometry or geography you might not need to do this step.</p>
<p>So open SSMS and navigate to your database and use the following TSQL to create a table here I call it t064</p>
<div><div id="highlighter_477841" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">SET</code> <code class="sql plain">ANSI_NULLS </code><code class="sql keyword">ON</code></div><div class="line number2 index1 alt1"><code class="sql plain">GO</code></div><div class="line number3 index2 alt2"> </div><div class="line number4 index3 alt1"><code class="sql keyword">SET</code> <code class="sql plain">QUOTED_IDENTIFIER </code><code class="sql keyword">ON</code></div><div class="line number5 index4 alt2"><code class="sql plain">GO</code></div><div class="line number6 index5 alt1"> </div><div class="line number7 index6 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TABLE</code> <code class="sql plain">[dbo].[t064](</code></div><div class="line number8 index7 alt1"><code class="sql plain">[PKID] [</code><code class="sql keyword">int</code><code class="sql plain">] IDENTITY(1,1) </code><code class="sql color1">NOT</code> <code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number9 index8 alt2"><code class="sql plain">[geomcol] [geometry] </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number10 index9 alt1"><code class="sql plain">[sitename] [</code><code class="sql keyword">varchar</code><code class="sql plain">](30) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number11 index10 alt2"><code class="sql keyword">PRIMARY</code> <code class="sql keyword">KEY</code> <code class="sql plain">CLUSTERED</code></div><div class="line number12 index11 alt1"><code class="sql plain">(</code></div><div class="line number13 index12 alt2"><code class="sql plain">[PKID] </code><code class="sql keyword">ASC</code></div><div class="line number14 index13 alt1"><code class="sql plain">)</code><code class="sql keyword">WITH</code> <code class="sql plain">(STATISTICS_NORECOMPUTE = </code><code class="sql keyword">OFF</code><code class="sql plain">, IGNORE_DUP_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">, OPTIMIZE_FOR_SEQUENTIAL_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number15 index14 alt2"><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">] TEXTIMAGE_ON [</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number16 index15 alt1"><code class="sql plain">GO</code></div></div></td></tr></tbody></table></div></div>
<p>This is a really simple table with three columns and you might want to link to it through QGIS and just create a few records – I would try and use a default projection of 27700 if you are UK based. I might come back with an example table with records..</p>
<p>If you want to link to this table for testing then you should try and input at least one record here. I added records using QGIS and I hope to come back to this post and update it to be more specific</p>
<p><strong>7) White List the IP within your SQL Server or SQL Azure instance.</strong><br>
<a href="https://learn.microsoft.com/en-us/azure/azure-sql/database/firewall-configure?view=azuresql" rel="noopener" target="_blank">Setting IP White List in SQL Azure</a></p>
<p><strong>8) Opening Geoserver and setting the ‘Store’ to reference your SQL Azure database using the login setup in step 5</strong></p>
<p>Navigate to the local host url for Geoserver namely</p>
<p><a href="http://localhost:8080/geoserver/web/?0" rel="noopener" target="_blank">http://localhost:8080/geoserver/web/?0</a></p>
<p>Go to store and then you should see the following page</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-23.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-23.jpg" alt="" width="635" height="399" class="aligncenter size-full wp-image-4387" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-23.jpg 635w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-23-300x189.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Hit the Add New Store green plus button in the top left corner you will be presented with the following screen </p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5.png" alt="" width="1093" height="839" class="aligncenter size-full wp-image-4404" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5.png 1093w, https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5-300x230.png 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5-1024x786.png 1024w, https://cloudydatablog.net/wp-content/uploads/2024/01/capture-5-768x590.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Fill out as many details as you can</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-24.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-24.jpg" alt="" width="537" height="855" class="aligncenter size-full wp-image-4388" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-24.jpg 537w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-24-188x300.jpg 188w" sizes="auto, (max-width: 537px) 85vw, 537px"></a></p>
<p>For SQL Azure this is likely to be similar to the following</p>
<div><div id="highlighter_76228" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">Host = namevariable.</code><code class="sql keyword">database</code><code class="sql plain">.windows.net (normally </code><code class="sql keyword">unique</code> <code class="sql keyword">to</code> <code class="sql plain">instance </code><code class="sql color1">in</code> <code class="sql plain">SQL Azure)</code></div><div class="line number2 index1 alt1"><code class="sql plain">Port = 1433 (sql azure </code><code class="sql keyword">default</code><code class="sql plain">)</code></div><div class="line number3 index2 alt2"><code class="sql keyword">Schema</code> <code class="sql plain">= dbo (sql azure </code><code class="sql keyword">default</code> <code class="sql keyword">is</code> <code class="sql plain">dbo but your </code><code class="sql keyword">database</code> <code class="sql plain">maybe bespoke)</code></div><div class="line number4 index3 alt1"><code class="sql color2">User</code> <code class="sql plain">= uservariable (remember least privilege </code><code class="sql keyword">is</code> <code class="sql plain">a good idea)</code></div><div class="line number5 index4 alt2"><code class="sql plain">Passwd = passwordvariable (should be </code><code class="sql keyword">unique</code> <code class="sql keyword">to</code> <code class="sql plain">your </code><code class="sql keyword">database</code><code class="sql plain">)</code></div></div></td></tr></tbody></table></div></div>
<p>Save and Apply and then your new connection should appear in your store</p>
<p>Here’s an example…. (see top line)<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-25.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-25.jpg" alt="" width="612" height="246" class="aligncenter size-full wp-image-4392" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-25.jpg 612w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-25-300x121.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>For the purposes of this tutorial I setup a login with db_owner rights to the database LandRegisterAzure your mileage will vary.</p>
<p><strong>9) Next we add the layer which references the SQL Server</strong></p>
<p>Select Layers within the Data section of the menu (usually to the left of the geoserver dashboard) then hit Add a new layer</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-26.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-26.jpg" alt="" width="595" height="452" class="aligncenter size-full wp-image-4394" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-26.jpg 595w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-26-300x228.jpg 300w" sizes="auto, (max-width: 595px) 85vw, 595px"></a></p>
<p>You should get the following windows</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-27.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-27.jpg" alt="" width="523" height="210" class="aligncenter size-full wp-image-4395" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-27.jpg 523w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-27-300x120.jpg 300w" sizes="auto, (max-width: 523px) 85vw, 523px"></a></p>
<p>From the drop down select the store which references your SQL server. This will reveal all the tables and views in the database and you scroll through them to the table or view you wish to publish and in the column marked Action will be publish you can hit the <code>Publish</code> highlighted text (I’ve done that here already so under Action our table is marked as <code>Publish again</code> and there is a tick in the column titled Published.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-28.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-28.jpg" alt="" width="597" height="159" class="aligncenter size-full wp-image-4396" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-28.jpg 597w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-28-300x80.jpg 300w" sizes="auto, (max-width: 597px) 85vw, 597px"></a></p>
<p>We can now quickly test to see if things look like they are working by going to Layer Preview.</p>
<p>Look to the left hand side and select Layer Preview</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.png" alt="" width="233" height="361" class="aligncenter size-full wp-image-4393" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4.png 233w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-4-194x300.png 194w" sizes="auto, (max-width: 233px) 85vw, 233px"></a></p>
<p>Scroll down through the list and identify the layer that you have just added. I now select the open layers option</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-29.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-29.jpg" alt="" width="601" height="109" class="aligncenter size-full wp-image-4399" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-29.jpg 601w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-29-300x54.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>A new browser tab will open and if you have successfully configured the SQL Server you should be presented with your layer – without any background</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-30.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-30.jpg" alt="" width="585" height="454" class="aligncenter size-full wp-image-4400" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-30.jpg 585w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-30-300x233.jpg 300w" sizes="auto, (max-width: 585px) 85vw, 585px"></a></p>
<p>10) I don’t go into it here but next I will try and write up my notes on QGIS and Geoserver setup – On my laptop I managed to set up a WFS to my SQL Azure instance through Geoserver where the layer was added to a project and I was able to edit information in my SQL Azure database through QGIS and were displayed correctly against a basemap in the right place!!</p>
<p>–/END/–</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/installation-and-configuration-of-geoserver-for-sql-azure-on-windows-should-work-for-any-sql-server-instance/" rel="bookmark"><time class="entry-date published" datetime="2024-01-19T15:23:58+00:00">19/01/2024</time><time class="updated" datetime="2024-03-04T13:02:51+00:00">04/03/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/configuration/" rel="category tag">Configuration</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a>, <a href="https://cloudydatablog.net/category/geographical-information-systems/" rel="category tag">Geographical Information Systems</a>, <a href="https://cloudydatablog.net/category/geoserver/" rel="category tag">Geoserver</a>, <a href="https://cloudydatablog.net/category/gis/" rel="category tag">GIS</a>, <a href="https://cloudydatablog.net/category/project-management/" rel="category tag">Project Management</a>, <a href="https://cloudydatablog.net/category/qgis/" rel="category tag">QGIS General</a>, <a href="https://cloudydatablog.net/category/rtpi-gis/" rel="category tag">RTPI - GIS</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4348 -->
<article id="post-4325" class="post-4325 post type-post status-publish format-standard hentry category-all category-continual-professional-development category-open-source category-rtpi-gis category-rtpi-list">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/spatial-data-hub-scotland/" rel="bookmark">Spatial Data Hub Scotland</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664.jpg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4345" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664.jpg 1024w, https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664-300x300.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664-150x150.jpg 150w, https://cloudydatablog.net/wp-content/uploads/2024/01/3384633b-0825-4913-a428-f7aa1ab30664-768x768.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Planning in the UK has for a long time suffered from a classic siloing of data by authority resulting in slow and varied analysis of information. Authorities relied on talented motivated individuals with particular interests and skills to develop bespoke solutions that assisted in the development of things like housing land audits , population forecasts , capital planning and local plan development which while often impressive individually struggled to transfer between authorities.</p>
<p>The continual improvement of digital tools has dramatically improved standardisation of the attributes of particular spatial data sets and database technology originally developed for accounting systems and flight control systems is starting to be applied to the amalgamation and analysis of planning related information. Within the UK different regions are progressing along this path at different rates. Scotland now has a body the Improvement Service who has a specific remit to collect spatial planning data which they do at something call the Spatial Data Hub.</p>
<p>The <a href="https://data.spatialhub.scot/dataset/?groups=national" rel="noopener" target="_blank">Spatial data hub</a> at 08 January 2024 had 59 datasets listed at Scotland coverage level. Including<br>
Planning application boundaries<br>
School Catchment Areas<br>
Housing Land Supply<br>
Vacant and Derelict Land<br>
Employment Land</p>
<p>The improvement service has been building these datasets for a number of years now however last year they expanded general access to much of the information and I have since been experimenting with it to see what can be achieved.</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/spatial-data-hub-scotland/" rel="bookmark"><time class="entry-date published" datetime="2024-01-08T16:56:16+00:00">08/01/2024</time><time class="updated" datetime="2024-01-10T10:48:25+00:00">10/01/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/continual-professional-development/" rel="category tag">Continual Professional Development</a>, <a href="https://cloudydatablog.net/category/open-source/" rel="category tag">Open Source</a>, <a href="https://cloudydatablog.net/category/rtpi-gis/" rel="category tag">RTPI - GIS</a>, <a href="https://cloudydatablog.net/category/rtpi-list/" rel="category tag">RTPI List</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4325 -->
<article id="post-4547" class="post-4547 post type-post status-publish format-standard hentry category-all category-css category-wordpress">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/additional-css-for-wordpress/" rel="bookmark">Additional CSS for WordPress</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Very useful when coupled with OceanWP and Code Block Pro – Beautiful Syntax Highlighting</p>
<div><div id="highlighter_84240" class="syntaxhighlighter css"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="css plain">.newwidth {</code></div><div class="line number2 index1 alt1"><code class="css spaces"> </code><code class="css keyword">width</code><code class="css plain">: </code><code class="css value">600px</code><code class="css plain">;</code></div><div class="line number3 index2 alt2"><code class="css spaces"> </code><code class="css keyword">max-width</code><code class="css plain">: </code><code class="css value">100%</code><code class="css plain">; </code><code class="css comments">/* This prevents it from exceeding the screen width */</code></div><div class="line number4 index3 alt1"><code class="css spaces"> </code><code class="css keyword">margin</code><code class="css plain">: </code><code class="css value">0</code> <code class="css value">auto</code><code class="css plain">; </code><code class="css comments">/* This centers the block horizontally */</code></div><div class="line number5 index4 alt2"><code class="css spaces"> </code><code class="css keyword">text-align</code><code class="css plain">: </code><code class="css value">center</code><code class="css plain">; </code><code class="css comments">/* This centers the content within the block */</code></div><div class="line number6 index5 alt1"><code class="css spaces"> </code><code class="css plain">}</code></div></div></td></tr></tbody></table></div></div>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/additional-css-for-wordpress/" rel="bookmark"><time class="entry-date published" datetime="2024-01-06T14:31:58+00:00">06/01/2024</time><time class="updated" datetime="2024-03-06T14:36:23+00:00">06/03/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/css/" rel="category tag">CSS</a>, <a href="https://cloudydatablog.net/category/wordpress/" rel="category tag">Wordpress</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4547 -->
<article id="post-4293" class="post-4293 post type-post status-publish format-standard hentry category-all category-sql-azure category-sql-azure-trigger category-ssms category-tsql-scripts">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/sql-azure-using-a-trigger-to-watch-change-of-fields/" rel="bookmark">SQL Azure – Using a Trigger to watch changes on fields</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>The below trigger monitors a table called t001Table4Monitoring and four particular fields / 3 date fields and one integer field. It monitors the trigger table and compares new values to old values using simple subtraction. As a comparison between null and a value will always return null we need to catch situations were a field is changed from null or to null hence the ISNULL section. The record has a bit field that is updated to True if change is detected.</p>
<p>This code was created with the help of GPT-4 </p>
<div><div id="highlighter_649092" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TRIGGER</code> <code class="sql plain">[dbo].[trg_Update_t001Table4Monitoring]</code></div><div class="line number2 index1 alt1"><code class="sql keyword">ON</code> <code class="sql plain">[dbo].[t001Table4Monitoring]</code></div><div class="line number3 index2 alt2"><code class="sql keyword">AFTER</code> <code class="sql keyword">UPDATE</code></div><div class="line number4 index3 alt1"><code class="sql keyword">AS</code></div><div class="line number5 index4 alt2"><code class="sql keyword">BEGIN</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">IF </code><code class="sql keyword">UPDATE</code><code class="sql plain">(Date01Monitor) </code><code class="sql color1">OR</code> <code class="sql keyword">UPDATE</code><code class="sql plain">(Date02Monitor) </code><code class="sql color1">OR</code> <code class="sql keyword">UPDATE</code><code class="sql plain">(Date03Monitor) </code><code class="sql color1">OR</code> <code class="sql keyword">UPDATE</code><code class="sql plain">(IntegerMonitor)</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql keyword">BEGIN</code></div><div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql comments">-- Get old and new values</code></div><div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@old_Date01Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">, @new_Date01Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">;</code></div><div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@old_Date02Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">, @new_Date02Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">;</code></div><div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@old_Date03Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">, @new_Date03Monitor </code><code class="sql keyword">DATE</code><code class="sql plain">;</code></div><div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@old_IntegerMonitor </code><code class="sql keyword">INT</code><code class="sql plain">, @new_IntegerMonitor </code><code class="sql keyword">INT</code><code class="sql plain">;</code></div><div class="line number13 index12 alt2"> </div><div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql keyword">SELECT</code> <code class="sql plain">@old_Date01Monitor = Date01Monitor, @old_Date02Monitor = Date02Monitor, @old_Date03Monitor = Date03Monitor, @old_IntegerMonitor = IntegerMonitor </code><code class="sql keyword">FROM</code> <code class="sql plain">deleted;</code></div><div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql keyword">SELECT</code> <code class="sql plain">@new_Date01Monitor = Date01Monitor, @new_Date02Monitor = Date02Monitor, @new_Date03Monitor = Date03Monitor, @new_IntegerMonitor = IntegerMonitor </code><code class="sql keyword">FROM</code> <code class="sql plain">inserted;</code></div><div class="line number16 index15 alt1"> </div><div class="line number17 index16 alt2"><code class="sql spaces"> </code><code class="sql comments">-- Check if values have changed</code></div><div class="line number18 index17 alt1"><code class="sql spaces"> </code><code class="sql plain">IF (</code><code class="sql color2">ISNULL</code><code class="sql plain">(@old_Date01Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">) <> </code><code class="sql color2">ISNULL</code><code class="sql plain">(@new_Date01Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">)) </code><code class="sql color1">OR</code></div><div class="line number19 index18 alt2"><code class="sql spaces"> </code><code class="sql plain">(</code><code class="sql color2">ISNULL</code><code class="sql plain">(@old_Date02Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">) <> </code><code class="sql color2">ISNULL</code><code class="sql plain">(@new_Date02Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">)) </code><code class="sql color1">OR</code></div><div class="line number20 index19 alt1"><code class="sql spaces"> </code><code class="sql plain">(</code><code class="sql color2">ISNULL</code><code class="sql plain">(@old_Date03Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">) <> </code><code class="sql color2">ISNULL</code><code class="sql plain">(@new_Date03Monitor, </code><code class="sql string">'1900-01-01'</code><code class="sql plain">)) </code><code class="sql color1">OR</code></div><div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql plain">(</code><code class="sql color2">ISNULL</code><code class="sql plain">(@old_IntegerMonitor, 0) <> </code><code class="sql color2">ISNULL</code><code class="sql plain">(@new_IntegerMonitor, 0))</code></div><div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql keyword">BEGIN</code></div><div class="line number23 index22 alt2"><code class="sql spaces"> </code><code class="sql keyword">UPDATE</code> <code class="sql plain">dbo.t001Table4Monitoring</code></div><div class="line number24 index23 alt1"><code class="sql spaces"> </code><code class="sql keyword">SET</code> <code class="sql plain">RecordChanged = 1</code></div><div class="line number25 index24 alt2"><code class="sql spaces"> </code><code class="sql keyword">FROM</code> <code class="sql plain">dbo.t001Table4Monitoring t</code></div><div class="line number26 index25 alt1"><code class="sql spaces"> </code><code class="sql keyword">INNER</code> <code class="sql color1">JOIN</code> <code class="sql plain">inserted i </code><code class="sql keyword">ON</code> <code class="sql plain">t.pkid = i.pkid</code></div><div class="line number27 index26 alt2"><code class="sql spaces"> </code><code class="sql keyword">END</code></div><div class="line number28 index27 alt1"><code class="sql spaces"> </code><code class="sql keyword">END</code></div><div class="line number29 index28 alt2"><code class="sql keyword">END</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/sql-azure-using-a-trigger-to-watch-change-of-fields/" rel="bookmark"><time class="entry-date published" datetime="2024-01-01T20:51:14+00:00">01/01/2024</time><time class="updated" datetime="2024-01-03T21:16:15+00:00">03/01/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/sql-azure/" rel="category tag">SQL Azure</a>, <a href="https://cloudydatablog.net/category/sql-azure-trigger/" rel="category tag">SQL Azure Trigger</a>, <a href="https://cloudydatablog.net/category/ssms/" rel="category tag">SSMS</a>, <a href="https://cloudydatablog.net/category/tsql-scripts/" rel="category tag">TSQL scripts</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4293 -->
<article id="post-4281" class="post-4281 post type-post status-publish format-standard hentry category-all category-javascript category-ms-azure-dev-ops category-sql-azure category-sql-server category-ssms category-tsql-scripts category-tsql-user-defined-function">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/sql-azure-adjusting-for-different-timezones-a-practical-example/" rel="bookmark">SQL Azure – Adjusting for different timezones a practical example</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Here I create a main table which can be used to translate times into a UTC value using a function I store here. It should be noted that if you have a field with variable type set to datetime and you set the default to GetDate() – the server will create a UTC value on record creation but time is set on the server and with SQL Azure you don’t have an option to change it.</p>
<div><div id="highlighter_324392" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TABLE</code> <code class="sql plain">[dbo].[MainTable](</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[pkid] [</code><code class="sql keyword">int</code><code class="sql plain">] IDENTITY(1,1) </code><code class="sql color1">NOT</code> <code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">[storeddatetime] [datetime] </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">[timezonename] [nvarchar](128) </code><code class="sql color1">NULL</code></div><div class="line number5 index4 alt2"><code class="sql keyword">PRIMARY</code> <code class="sql keyword">KEY</code> <code class="sql plain">CLUSTERED </code></div><div class="line number6 index5 alt1"><code class="sql plain">(</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">[pkid] </code><code class="sql keyword">ASC</code></div><div class="line number8 index7 alt1"><code class="sql plain">)</code><code class="sql keyword">WITH</code> <code class="sql plain">(PAD_INDEX = </code><code class="sql keyword">OFF</code><code class="sql plain">, STATISTICS_NORECOMPUTE = </code><code class="sql keyword">OFF</code><code class="sql plain">, IGNORE_DUP_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">, ALLOW_ROW_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">, ALLOW_PAGE_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number9 index8 alt2"><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number10 index9 alt1"><code class="sql plain">GO</code></div><div class="line number11 index10 alt2"> </div><div class="line number12 index11 alt1"><code class="sql keyword">ALTER</code> <code class="sql keyword">TABLE</code> <code class="sql plain">[dbo].[MainTable] </code><code class="sql keyword">ADD</code> <code class="sql keyword">CONSTRAINT</code> <code class="sql plain">[DF_MainTable_storeddatetime] </code><code class="sql keyword">DEFAULT</code> <code class="sql plain">(getdate()) </code><code class="sql keyword">FOR</code> <code class="sql plain">[storeddatetime]</code></div><div class="line number13 index12 alt2"><code class="sql plain">GO</code></div></div></td></tr></tbody></table></div></div>
<p>Next we create a timezone table</p>
<div><div id="highlighter_425465" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TABLE</code> <code class="sql plain">[dbo].[TimeZoneTable](</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[pkid] [</code><code class="sql keyword">int</code><code class="sql plain">] IDENTITY(1,1) </code><code class="sql color1">NOT</code> <code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">[timezonename] [nvarchar](128) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql keyword">PRIMARY</code> <code class="sql keyword">KEY</code> <code class="sql plain">CLUSTERED </code></div><div class="line number5 index4 alt2"><code class="sql plain">(</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">[pkid] </code><code class="sql keyword">ASC</code></div><div class="line number7 index6 alt2"><code class="sql plain">)</code><code class="sql keyword">WITH</code> <code class="sql plain">(PAD_INDEX = </code><code class="sql keyword">OFF</code><code class="sql plain">, STATISTICS_NORECOMPUTE = </code><code class="sql keyword">OFF</code><code class="sql plain">, IGNORE_DUP_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">, ALLOW_ROW_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">, ALLOW_PAGE_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number8 index7 alt1"><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number9 index8 alt2"><code class="sql plain">GO</code></div></div></td></tr></tbody></table></div></div>
<p>And we can populate this from sys.time_zone_info table.</p>
<div><div id="highlighter_138648" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">INSERT</code> <code class="sql keyword">INTO</code> <code class="sql plain">TimeZoneTable (timezonename)</code></div><div class="line number2 index1 alt1"><code class="sql keyword">SELECT</code> <code class="sql keyword">name</code> <code class="sql keyword">FROM</code> <code class="sql plain">sys.time_zone_info;</code></div></div></td></tr></tbody></table></div></div>
<p>We can create a function to convert this datetime value knowing the timezone into UTC is as follows</p>
<div><div id="highlighter_357187" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">FUNCTION</code> <code class="sql plain">dbo.fn_ConvertToUTC (@localDatetime DATETIME, @timeZone NVARCHAR(128))</code></div><div class="line number2 index1 alt1"><code class="sql keyword">RETURNS</code> <code class="sql plain">DATETIME</code></div><div class="line number3 index2 alt2"><code class="sql keyword">AS</code></div><div class="line number4 index3 alt1"><code class="sql keyword">BEGIN</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@utcDatetime DATETIME;</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql keyword">SET</code> <code class="sql plain">@utcDatetime = @localDatetime </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE @timeZone </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'UTC'</code><code class="sql plain">;</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql keyword">RETURN</code> <code class="sql plain">@utcDatetime;</code></div><div class="line number8 index7 alt1"><code class="sql keyword">END</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>Now runnig the following query on some example data we get the following</p>
<div><div id="highlighter_323890" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">SELECT</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">pkid, </code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">storeddatetime, </code></div><div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">timezonename, </code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">dbo.fn_ConvertToUTC(storeddatetime, timezonename) </code><code class="sql keyword">AS</code> <code class="sql plain">utcValue</code></div><div class="line number6 index5 alt1"><code class="sql keyword">FROM</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">MainTable;</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.png" alt="" width="500" height="483" class="aligncenter size-full wp-image-4290" srcset="https://cloudydatablog.net/wp-content/uploads/2024/01/Capture.png 500w, https://cloudydatablog.net/wp-content/uploads/2024/01/Capture-300x290.png 300w" sizes="auto, (max-width: 500px) 85vw, 500px"></a></p>
<p>And here is a function that will convert to local time from utc</p>
<div><div id="highlighter_614946" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">FUNCTION</code> <code class="sql plain">dbo.fn_ConvertToLocal (@utcDatetime DATETIME, @timeZone NVARCHAR(128))</code></div><div class="line number2 index1 alt1"><code class="sql keyword">RETURNS</code> <code class="sql plain">DATETIME</code></div><div class="line number3 index2 alt2"><code class="sql keyword">AS</code></div><div class="line number4 index3 alt1"><code class="sql keyword">BEGIN</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@localDatetime DATETIME;</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql keyword">SET</code> <code class="sql plain">@localDatetime = @utcDatetime </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'UTC'</code> <code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE @timeZone;</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql keyword">RETURN</code> <code class="sql plain">@localDatetime;</code></div><div class="line number8 index7 alt1"><code class="sql keyword">END</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>Javascript option<br>
The <code>getTimezoneOffset()</code> method of the Date object in JavaScript calculates the difference, in minutes, between the local time zone and the UTC time zone 1. The method returns a positive value if the local time zone is behind UTC, and a negative value if the local time zone is ahead of UTC 1.</p>
<p>The method works by subtracting the local time zone offset from UTC time. For example, if the local time zone is 5 hours behind UTC, then the method will return 300 (5 * 60) 2</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/sql-azure-adjusting-for-different-timezones-a-practical-example/" rel="bookmark"><time class="entry-date published" datetime="2024-01-01T20:12:51+00:00">01/01/2024</time><time class="updated" datetime="2024-01-01T20:35:23+00:00">01/01/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/javascript/" rel="category tag">Javascript</a>, <a href="https://cloudydatablog.net/category/ms-azure-dev-ops/" rel="category tag">MS Azure Dev Ops</a>, <a href="https://cloudydatablog.net/category/sql-azure/" rel="category tag">SQL Azure</a>, <a href="https://cloudydatablog.net/category/sql-server/" rel="category tag">SQL Server</a>, <a href="https://cloudydatablog.net/category/ssms/" rel="category tag">SSMS</a>, <a href="https://cloudydatablog.net/category/tsql-scripts/" rel="category tag">TSQL scripts</a>, <a href="https://cloudydatablog.net/category/tsql-user-defined-function/" rel="category tag">TSQL User Defined Function</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4281 -->
<article id="post-4272" class="post-4272 post type-post status-publish format-standard hentry category-all category-dev-ops category-general category-problem-solving category-productivity category-rtpi-list">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/everyone-gets-beaten-by-complexity/" rel="bookmark">Everyone gets beaten by Complexity</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1.jpg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4275" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1.jpg 1024w, https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1-300x300.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1-150x150.jpg 150w, https://cloudydatablog.net/wp-content/uploads/2023/12/66ae8a75-234b-4654-b570-b388bd6958b1-768x768.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>I don’t do that many strategic posts these days (compared with my first posts) but this is really a reminder to myself to always seek out the simplest solution especially when configuring systems and writing code. Less is generally always better. The above post was a DALL E production and the below graph is the simpler one which QED actually makes sense. I would suggest that the line moves to the right with improved education of staff / time / money and number of staff but eventually productivity dramatically drops with complexity no matter how much money , time or people.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-2.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-2.jpg" alt="" width="745" height="463" class="aligncenter size-full wp-image-4273" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-2.jpg 745w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-2-300x186.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/everyone-gets-beaten-by-complexity/" rel="bookmark"><time class="entry-date published" datetime="2023-12-13T16:06:20+00:00">13/12/2023</time><time class="updated" datetime="2024-01-10T10:49:33+00:00">10/01/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/dev-ops/" rel="category tag">Dev Ops</a>, <a href="https://cloudydatablog.net/category/general/" rel="category tag">General Opinion</a>, <a href="https://cloudydatablog.net/category/problem-solving/" rel="category tag">Problem Solving</a>, <a href="https://cloudydatablog.net/category/productivity/" rel="category tag">Productivity</a>, <a href="https://cloudydatablog.net/category/rtpi-list/" rel="category tag">RTPI List</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4272 -->
<article id="post-4261" class="post-4261 post type-post status-publish format-standard hentry category-all category-digital-mapping category-gis category-qgis category-rtpi-gis category-sql-server category-ssms">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/sql-server-express-connection-to-qgis-issues-with-geometry-display/" rel="bookmark">SQL Server Express – Connection to QGIS issues with geometry display</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>I was having issues displaying polygons stored in SQL Server Express locally within a QGIS 3.28 project.</p>
<p>After having quizzed unsuccessfully GPT 4.0 I found the answer on good old Stack Overflow.</p>
<p>As part of your SQL Server Express installation you should have installed SQL Server Configuration Manager. Open this administration package and navigate to your instance to show the following;</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/SQLServerConfiguration.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/SQLServerConfiguration.png" alt="" width="781" height="337" class="aligncenter size-full wp-image-4262" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/SQLServerConfiguration.png 781w, https://cloudydatablog.net/wp-content/uploads/2023/12/SQLServerConfiguration-300x129.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/SQLServerConfiguration-768x331.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Make sure both Named Pipes and TCP/IP are enabled.</p>
<p>That fixed it for me<br>
Important note the host connection string IS case sensitive and sometimes when you use the properties from within SSMS to look at the hostname it capitalise things so watch out! That caught me out for half an hour!!</p>
<p>And here is my definition of the geometry table</p>
<div><div id="highlighter_883867" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">TABLE</code> <code class="sql plain">[dbo].[geometry_columns](</code></div><div class="line number2 index1 alt1"><code class="sql plain">[pkid] [</code><code class="sql keyword">int</code><code class="sql plain">] IDENTITY(1,1) </code><code class="sql color1">NOT</code> <code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql plain">[f_table_catalog] [</code><code class="sql keyword">varchar</code><code class="sql plain">](50) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql plain">[f_table_schema] [</code><code class="sql keyword">varchar</code><code class="sql plain">](50) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number5 index4 alt2"><code class="sql plain">[f_table_name] [</code><code class="sql keyword">varchar</code><code class="sql plain">](100) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number6 index5 alt1"><code class="sql plain">[f_geometry_column] [</code><code class="sql keyword">varchar</code><code class="sql plain">](50) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number7 index6 alt2"><code class="sql plain">[coord_dimension] [</code><code class="sql keyword">int</code><code class="sql plain">] </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number8 index7 alt1"><code class="sql plain">[srid] [</code><code class="sql keyword">int</code><code class="sql plain">] </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number9 index8 alt2"><code class="sql plain">[geometry_type] [</code><code class="sql keyword">varchar</code><code class="sql plain">](50) </code><code class="sql color1">NULL</code><code class="sql plain">,</code></div><div class="line number10 index9 alt1"><code class="sql keyword">PRIMARY</code> <code class="sql keyword">KEY</code> <code class="sql plain">CLUSTERED</code></div><div class="line number11 index10 alt2"><code class="sql plain">(</code></div><div class="line number12 index11 alt1"><code class="sql plain">[pkid] </code><code class="sql keyword">ASC</code></div><div class="line number13 index12 alt2"><code class="sql plain">)</code><code class="sql keyword">WITH</code> <code class="sql plain">(PAD_INDEX = </code><code class="sql keyword">OFF</code><code class="sql plain">, STATISTICS_NORECOMPUTE = </code><code class="sql keyword">OFF</code><code class="sql plain">, IGNORE_DUP_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">, ALLOW_ROW_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">, ALLOW_PAGE_LOCKS = </code><code class="sql keyword">ON</code><code class="sql plain">, OPTIMIZE_FOR_SEQUENTIAL_KEY = </code><code class="sql keyword">OFF</code><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number14 index13 alt1"><code class="sql plain">) </code><code class="sql keyword">ON</code> <code class="sql plain">[</code><code class="sql keyword">PRIMARY</code><code class="sql plain">]</code></div><div class="line number15 index14 alt2"><code class="sql plain">GO</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.png" alt="" width="1030" height="569" class="aligncenter size-full wp-image-4270" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.png 1030w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1-300x166.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1-1024x566.png 1024w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1-768x424.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/sql-server-express-connection-to-qgis-issues-with-geometry-display/" rel="bookmark"><time class="entry-date published" datetime="2023-12-08T13:34:50+00:00">08/12/2023</time><time class="updated" datetime="2024-01-10T10:21:36+00:00">10/01/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/digital-mapping/" rel="category tag">Digital Mapping</a>, <a href="https://cloudydatablog.net/category/gis/" rel="category tag">GIS</a>, <a href="https://cloudydatablog.net/category/qgis/" rel="category tag">QGIS General</a>, <a href="https://cloudydatablog.net/category/rtpi-gis/" rel="category tag">RTPI - GIS</a>, <a href="https://cloudydatablog.net/category/sql-server/" rel="category tag">SQL Server</a>, <a href="https://cloudydatablog.net/category/ssms/" rel="category tag">SSMS</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4261 -->
<article id="post-4239" class="post-4239 post type-post status-publish format-standard hentry category-ai category-all category-javascript category-php category-phprunner category-rad-web-tools category-zagon">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/referencing-a-field-in-a-pop-up-in-phprunner/" rel="bookmark">PHPRunner – Pass Value to CSS Reference using Javascript in a pop up</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Javascript is very powerful and will easily calculate all sorts of interesting things for you dynamically. In PHPRunner I use the popup windows for nearly every table or view form so I wanted it to work with these.</p>
<p>But with PHPRunner we want to store these in the database. I had a devilish time finding a way of referencing the field with which to copy any Javascript value into. After some lengthy discussion with ChatGPT 4 (via Bing) it suggested that I might try and use the CSS Selector. </p>
<p>I then discovered that I couldn’t seem to identify the name of the CSS Selector.</p>
<p>What I discovered is that I could not see a static CSS Selector reference for any of the fields except those that I had altered the formatting on for example changing the font to Roboto Mono.</p>
<p>So first step choose your target field and then alter it using the PHP page designer and then publish.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/capture.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/capture.png" alt="" width="920" height="666" class="aligncenter size-full wp-image-4240" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/capture.png 920w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture-300x217.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture-768x556.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>What I discovered was after that I could use the inspect item to identify the CSS Selector </p>
<p>On the published application navigate to the form and the field you wish to target for entry right click and select inspect.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2.png" alt="" width="627" height="604" class="aligncenter size-full wp-image-4241" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2.png 627w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-300x289.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Look to the DevTools window (in chrome and you should see in bold the css names of your field</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1.png" alt="" width="1276" height="722" class="aligncenter size-full wp-image-4244" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1.png 1276w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1-300x170.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1-1024x579.png 1024w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1-768x435.png 768w, https://cloudydatablog.net/wp-content/uploads/2023/12/capture2-1-1200x679.png 1200w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>You can then ask ChatGPT the following</p>
<p>Can you parse the input css selector I need from the following string that can be used by javascipt to be passed a value</p>
<div><div id="highlighter_556897" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">[data-page=</code><code class="sql string">"t0017_add"</code><code class="sql plain">][data-itemid=</code><code class="sql string">"integrated_edit_field4"</code><code class="sql plain">][data-page=</code><code class="sql string">"t0017_add"</code><code class="sql plain">][data-itemid=</code><code class="sql string">"integrated_edit_field4"</code><code class="sql plain">][data-page=</code><code class="sql string">"t0017_add"</code><code class="sql plain">][data-itemid=</code><code class="sql string">"integrated_edit_field4"</code><code class="sql plain">][data-page=</code><code class="sql string">"t0017_add"</code><code class="sql plain">][data-itemid=</code><code class="sql string">"integrated_edit_field4"</code><code class="sql plain">] > * > * > input</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture.jpg" alt="" width="680" height="245" class="aligncenter size-full wp-image-4245" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture.jpg 680w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-300x108.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>An element is a part of a webpage. In XML and HTML, an element may contain a data item or a chunk of text or an image, or perhaps nothing. A typical element includes an opening tag with some attributes, enclosed text content, and a closing tag. Elements and tags are not the same things.</p>
<p>More on elements is available <a href="https://blog.hubspot.com/website/html-elements" rel="noopener" target="_blank">here</a></p>
<p>This can now be used behind a button and away we go… see below</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3.jpg" alt="" width="1174" height="556" class="aligncenter size-full wp-image-4247" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3.jpg 1174w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-300x142.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-1024x485.jpg 1024w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-768x364.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<div><div id="highlighter_629023" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">document.querySelector(</code><code class="sql string">'[data-page="t0017_add"][data-itemid="integrated_edit_field4"] > * > * > input'</code><code class="sql plain">).value = </code><code class="sql string">"Password123"</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>And here are some notes on finding CSS Selectors by ChatGPT4 I am still investigating CSS Selectors there seems to be a black art to understanding their structure and how they can be useful<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-1.jpg" alt="" width="713" height="536" class="aligncenter size-full wp-image-4251" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-1.jpg 713w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture3-1-300x226.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>I also asked chatGPT about child selectors in CSS. In my discussions with chatGPT I have discovered that spaces are important and symbols are important in naming and of course Javascript is case sensitive. The dynamic nature of CSS Selectors and their very specific naming conventions combined with spaces potentially being characters really means you need to be on your toes when you use them.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.jpg" alt="" width="1016" height="803" class="aligncenter size-full wp-image-4256" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1.jpg 1016w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1-300x237.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-1-768x607.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/referencing-a-field-in-a-pop-up-in-phprunner/" rel="bookmark"><time class="entry-date published" datetime="2023-12-01T16:41:28+00:00">01/12/2023</time><time class="updated" datetime="2023-12-02T11:46:47+00:00">02/12/2023</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/ai/" rel="category tag">AI</a>, <a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/javascript/" rel="category tag">Javascript</a>, <a href="https://cloudydatablog.net/category/php/" rel="category tag">php</a>, <a href="https://cloudydatablog.net/category/phprunner/" rel="category tag">PHPRunner</a>, <a href="https://cloudydatablog.net/category/rad-web-tools/" rel="category tag">RAD Web Tools</a>, <a href="https://cloudydatablog.net/category/zagon/" rel="category tag">Zagon</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4239 -->
<article id="post-4470" class="post-4470 post type-post status-publish format-standard hentry category-all category-geographical-information-systems category-geoserver category-gis category-postgres">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/geoserver-setting-up-users-roles-workspaces-and-layers/" rel="bookmark">Geoserver – Setting up Users / Roles / Workspaces and Layers</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>Create Users<br>
Firstly ensure you are logged in as administrator ONLY the system administrator can set up users and roles and the default geoserver username/password of the administrator is admin/geoserver</p>
<p>The sa login has additional menus as here</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture.jpg" alt="" width="205" height="830" class="aligncenter size-full wp-image-4471" srcset="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture.jpg 205w, https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-74x300.jpg 74w" sizes="auto, (max-width: 205px) 85vw, 205px"></a></p>
<p>Go to the Security menu on left towards the bottom and find line marked – Users/Groups/Roles</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-1.jpg" alt="" width="177" height="137" class="aligncenter size-full wp-image-4472"></a></p>
<p>Go to the Roles tab<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-3.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-3.jpg" alt="" width="676" height="369" class="aligncenter size-full wp-image-4476" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-3.jpg 676w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-3-300x164.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Look to the green circle with white cross and add new role and complete as appropriate</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-5.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-5.jpg" alt="" width="709" height="350" class="aligncenter size-full wp-image-4479" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-5.jpg 709w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-5-300x148.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Note once you have created the role you will not be able to edit the name of that role so you have to delete the role and then create a role with a different name if you don’t want the old role name to continue.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-6.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-6.jpg" alt="" width="702" height="418" class="aligncenter size-full wp-image-4482" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-6.jpg 702w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-6-300x179.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Next we create the users</p>
<p>Go to the Users/Groups tab</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-2.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-2.jpg" alt="" width="668" height="347" class="aligncenter size-full wp-image-4473" srcset="https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-2.jpg 668w, https://cloudydatablog.net/wp-content/uploads/2024/02/Capture-2-300x156.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Look to the green circle with white cross and add new user and within the Roles taken section ensure you move the role you created from the left box to the right see grey above.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7.jpg" alt="" width="901" height="1030" class="aligncenter size-full wp-image-4483" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7.jpg 901w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7-262x300.jpg 262w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7-896x1024.jpg 896w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-7-768x878.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>The new username should now appear in the User list</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-8.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-8.jpg" alt="" width="698" height="517" class="aligncenter size-full wp-image-4484" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-8.jpg 698w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-8-300x222.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>You grant admin privileges to the workspaces through the Workspace section as follows<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-9.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-9.jpg" alt="" width="703" height="221" class="aligncenter size-full wp-image-4487" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-9.jpg 703w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-9-300x94.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Within the edit workspace section go to security<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-10.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-10.jpg" alt="" width="706" height="410" class="aligncenter size-full wp-image-4488" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-10.jpg 706w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-10-300x174.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>And give admin rights to the role you wish to link to the workspace</p>
<p>Note that you still won’t see anything until you go into layer edit and edit the security as follows.<br>
<a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-11.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-11.jpg" alt="" width="698" height="452" class="aligncenter size-full wp-image-4489" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-11.jpg 698w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-11-300x194.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-12.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-12.jpg" alt="" width="1019" height="322" class="aligncenter size-full wp-image-4491" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-12.jpg 1019w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-12-300x95.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-12-768x243.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Within the Security section you can also see the roles added</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-13.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-13.jpg" alt="" width="819" height="402" class="aligncenter size-full wp-image-4493" srcset="https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-13.jpg 819w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-13-300x147.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/12/Capture-13-768x377.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/geoserver-setting-up-users-roles-workspaces-and-layers/" rel="bookmark"><time class="entry-date published" datetime="2023-12-01T15:46:26+00:00">01/12/2023</time><time class="updated" datetime="2024-02-01T16:51:02+00:00">01/02/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/geographical-information-systems/" rel="category tag">Geographical Information Systems</a>, <a href="https://cloudydatablog.net/category/geoserver/" rel="category tag">Geoserver</a>, <a href="https://cloudydatablog.net/category/gis/" rel="category tag">GIS</a>, <a href="https://cloudydatablog.net/category/postgres/" rel="category tag">Postgres</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4470 -->
<article id="post-4223" class="post-4223 post type-post status-publish format-standard hentry category-all category-phprunner category-sweet-alert">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/phprunner-and-ms-sql-azure-running-a-stored-procedure-behind-a-button-with-sweet-alert-user-feedback/" rel="bookmark">PHPRunner and MS SQL Azure – Running a Stored Procedure behind a button – With Sweet Alert User Feedback</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p>I have written previously about triggering stored procedures in MS SQL Azure through a PHP Runner generated web front end. This is a vanilla explanation which includes sweet alerts to indicate users updating them on the progress of longer running stored procedures. It also locks the front end preventing users from rushing procedures until the queries have had time to complete. </p>
<p>Firstly navigate to the table you wish to run the stored procedure from in this example it is table T032Email List Screen</p>
<p><code>Insert</code> a Custom Button here I call it Transform</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-3.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-3.jpg" alt="" width="997" height="492" class="aligncenter size-full wp-image-4224" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-3.jpg 997w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-3-300x148.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-3-768x379.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Next select the button and look to the right for the Edit Button Code button.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled.png" alt="" width="1156" height="745" class="aligncenter size-full wp-image-4225" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled.png 1156w, https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled-300x193.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled-1024x660.png 1024w, https://cloudydatablog.net/wp-content/uploads/2023/11/Untitled-768x495.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>You will be presented with the <code>Buttons properties</code> window dialog with three tabs<br>
1=Client Before<br>
2=Server<br>
3=Client After</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-4.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-4.jpg" alt="" width="775" height="665" class="aligncenter size-full wp-image-4226" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-4.jpg 775w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-4-300x257.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-4-768x659.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>1) In the Client Before place the following code</p>
<div><div id="highlighter_332414" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">Swal.fire({</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">icon:</code><code class="sql string">"info"</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">title: </code><code class="sql string">'Please wait... transforming selected records'</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">allowOutsideClick: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">allowEscapeKey: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">showConfirmButton: </code><code class="sql keyword">false</code></div><div class="line number7 index6 alt2"><code class="sql plain">});</code></div></div></td></tr></tbody></table></div></div>
<p>If you would like to include a loading circle then you could use the following code.</p>
<div><div id="highlighter_940180" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">Swal.fire({</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">icon:</code><code class="sql string">"info"</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">title: </code><code class="sql string">'Please wait... identifying and recording number of houses and flats on residential sites'</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">allowOutsideClick: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">allowEscapeKey: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">showConfirmButton: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">didOpen: </code><code class="sql keyword">function</code> <code class="sql plain">() {</code></div><div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">Swal.showLoading()</code></div><div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">//you can put here an AJAX request simulated </code><code class="sql keyword">with</code> <code class="sql plain">setTimeout </code><code class="sql color1">or</code> <code class="sql plain">what you want...</code></div><div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div><div class="line number11 index10 alt2"><code class="sql plain">});</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-5.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-5.jpg" alt="" width="520" height="362" class="aligncenter size-full wp-image-4633" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-5.jpg 520w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-5-300x209.jpg 300w" sizes="auto, (max-width: 520px) 85vw, 520px"></a></p>
<p>2) On the Server trigger the stored procedure – swap out your stored procedure name.</p>
<div><div id="highlighter_26026" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">DB::</code><code class="sql keyword">Exec</code><code class="sql plain">(</code><code class="sql string">"EXEC dbo.transformemail"</code><code class="sql plain">);</code></div></div></td></tr></tbody></table></div></div>
<p>and on the 3) Client After notify the user once everything has been completed</p>
<div><div id="highlighter_553521" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql spaces"> </code><code class="sql plain">Swal.fire({</code></div><div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">icon: </code><code class="sql string">"success"</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">allowOutsideClick: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">allowEscapeKey: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">title: </code><code class="sql string">"Records Transformed"</code><code class="sql plain">,</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">showConfirmButton: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">timer: 2000</code></div><div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">});</code></div><div class="line number9 index8 alt2"><code class="sql plain">setTimeout(</code><code class="sql string">"window.t032emailPage.reload({a:'reload'})"</code><code class="sql plain">, 2000);</code></div></div></td></tr></tbody></table></div></div>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/phprunner-and-ms-sql-azure-running-a-stored-procedure-behind-a-button-with-sweet-alert-user-feedback/" rel="bookmark"><time class="entry-date published" datetime="2023-11-25T15:52:26+00:00">25/11/2023</time><time class="updated" datetime="2024-07-27T15:35:55+01:00">27/07/2024</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/phprunner/" rel="category tag">PHPRunner</a>, <a href="https://cloudydatablog.net/category/sweet-alert/" rel="category tag">Sweet Alert</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4223 -->
<article id="post-4201" class="post-4201 post type-post status-publish format-standard hentry category-all category-asp-net-runner category-crud category-low-coding-platforms category-php category-phprunner category-sweet-alert">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/phprunner-using-sweet-alerts-to-give-users-confirmation-of-save/" rel="bookmark">PHPRunner – Using Sweet Alerts to give Users confirmation of Save</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts.jpeg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts.jpeg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4217" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts.jpeg 1024w, https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts-300x300.jpeg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts-150x150.jpeg 150w, https://cloudydatablog.net/wp-content/uploads/2023/11/Sweet-Alerts-768x768.jpeg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>In PHPRunner as of version 10.51 the sweet alert javascript library is included in PHPRunner generated web applications.</p>
<p>How can we add code to a project to make bespoke adjustments?</p>
<p>Firstly navigate to the form you wish to add a special sweet alert to and insert a Custom Button.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.png"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.png" alt="" width="1096" height="745" class="aligncenter size-full wp-image-4204" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.png 1096w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-300x204.png 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-1024x696.png 1024w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-768x522.png 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>Next navigate to the Events tab in PHPRunner and expand the table or view to which you added the additional button.</p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-2.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-2.jpg" alt="" width="250" height="239" class="aligncenter size-full wp-image-4209"></a></p>
<p>Behind the <code>Javascipt OnLoad event</code> add the following code</p>
<div><div id="highlighter_102167" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">$(</code><code class="sql string">'a[id^="saveButton"]'</code><code class="sql plain">).hide(); // Hide button </code><code class="sql string">"Save"</code></div></div></td></tr></tbody></table></div></div>
<p>And on the <code>Client Before Event</code> of the new button add the following code</p>
<div><div id="highlighter_611318" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">Swal.fire({</code></div><div class="line number2 index1 alt1"><code class="sql plain">icon: </code><code class="sql string">"success"</code><code class="sql plain">,</code></div><div class="line number3 index2 alt2"><code class="sql plain">title: </code><code class="sql string">"Saved"</code><code class="sql plain">,</code></div><div class="line number4 index3 alt1"><code class="sql plain">showConfirmButton: </code><code class="sql keyword">false</code><code class="sql plain">,</code></div><div class="line number5 index4 alt2"><code class="sql plain">timer: 1000</code></div><div class="line number6 index5 alt1"><code class="sql plain">});</code></div><div class="line number7 index6 alt2"><code class="sql plain">$(</code><code class="sql string">'a[id^="saveButton"]'</code><code class="sql plain">).click();</code></div><div class="line number8 index7 alt1"><code class="sql keyword">return</code> <code class="sql keyword">false</code><code class="sql plain">;</code></div></div></td></tr></tbody></table></div></div>
<p>So what does the code do<br>
<code>Javascript OnLoad Event</code> – Hides the real save button<br>
<code>On Click</code> – Triggers the sweet alert success routine and once that is complete triggers the hidden savebutton code.</p>
<p>And more examples and inspiration</p>
<p><a href="https://sweetalert2.github.io/" rel="noopener" target="_blank">Sweet alert 2</a></p>
<p>And also if you find the Sweet Alert modal size too small add this to your page css:</p>
<div><div id="highlighter_621394" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql plain">.swal2-popup { font-</code><code class="sql keyword">size</code><code class="sql plain">: 1.6rem !important; }</code></div></div></td></tr></tbody></table></div></div>
<p>Most of this was from the following Xlinesoft User forum Thread<br>
<a href="https://asprunner.com/forums/topic/29701-Guide-52--Using-sweetalert2-to-confirm-save-data" rel="noopener" target="_blank">Thread</a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/phprunner-using-sweet-alerts-to-give-users-confirmation-of-save/" rel="bookmark"><time class="entry-date published" datetime="2023-11-22T20:14:30+00:00">22/11/2023</time><time class="updated" datetime="2023-11-25T16:12:46+00:00">25/11/2023</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/asp-net-runner/" rel="category tag">ASP-NET Runner</a>, <a href="https://cloudydatablog.net/category/crud/" rel="category tag">CRUD</a>, <a href="https://cloudydatablog.net/category/low-coding-platforms/" rel="category tag">Low Coding Platforms</a>, <a href="https://cloudydatablog.net/category/php/" rel="category tag">php</a>, <a href="https://cloudydatablog.net/category/phprunner/" rel="category tag">PHPRunner</a>, <a href="https://cloudydatablog.net/category/sweet-alert/" rel="category tag">Sweet Alert</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4201 -->
<article id="post-4168" class="post-4168 post type-post status-publish format-standard hentry category-ai category-all category-sql-azure category-sql-server category-ssms category-tsql-scripts category-tsql-user-defined-function category-zagon">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/sql-server-computed-column-create-utc-datetime-value-from-datetime-timezone-field/" rel="bookmark">MS SQL Azure – Computed Column – Create UTC Datetime value from Datetime & Timezone fields – Daylight Saving</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745.jpeg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745.jpeg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4178" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745.jpeg 1024w, https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745-300x300.jpeg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745-150x150.jpeg 150w, https://cloudydatablog.net/wp-content/uploads/2023/11/2825bc48-45d6-4a39-83e8-508fc6a3c745-768x768.jpeg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>This is not tested at time of writing obtained from ChatGPT 4</p>
<p><code>Answer</code><br>
Sure, here’s an example of how you might implement the ConvertToUTC function to handle time zones like ‘London/Europe’. This example uses the AT TIME ZONE clause, which is available in SQL Server 2016 and later:</p>
<div><div id="highlighter_767400" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">CREATE</code> <code class="sql keyword">FUNCTION</code> <code class="sql plain">dbo.ConvertToUTC (@localDateTime DATETIME, @timeZone NVARCHAR(50))</code></div><div class="line number2 index1 alt1"><code class="sql keyword">RETURNS</code> <code class="sql plain">DATETIME</code></div><div class="line number3 index2 alt2"><code class="sql keyword">AS</code></div><div class="line number4 index3 alt1"><code class="sql keyword">BEGIN</code></div><div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql comments">-- Convert the local datetime to a datetimeoffset value using the specified time zone</code></div><div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@datetimeoffset DATETIMEOFFSET = @localDateTime </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE @timeZone</code></div><div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql comments">-- Convert the datetimeoffset value to UTC</code></div><div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql keyword">DECLARE</code> <code class="sql plain">@utcDateTime DATETIME = </code><code class="sql color2">CONVERT</code><code class="sql plain">(DATETIME, SWITCHOFFSET(@datetimeoffset, 0))</code></div><div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql keyword">RETURN</code> <code class="sql plain">@utcDateTime</code></div><div class="line number10 index9 alt1"><code class="sql keyword">END</code></div></div></td></tr></tbody></table></div></div>
<p>You can then use this function in a computed column definition:</p>
<div><div id="highlighter_297789" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">ALTER</code> <code class="sql keyword">TABLE</code> <code class="sql plain">YourTable</code></div><div class="line number2 index1 alt1"><code class="sql keyword">ADD</code> <code class="sql plain">UtcDateTime </code><code class="sql keyword">AS</code> <code class="sql plain">dbo.ConvertToUTC(field01, field02)</code></div></div></td></tr></tbody></table></div></div>
<p>In this example, field02 should contain time zone names that are valid for the AT TIME ZONE clause. For example, ‘UTC’, ‘Pacific Standard Time’, ‘Central European Standard Time’, etc. For London, you would use ‘GMT Standard Time’.</p>
<p>Please note that this is just a basic example. The actual implementation would depend on how you’re storing time zone information and the specific requirements of your application. It’s also worth noting that handling date and time conversions can be complex due to factors like daylight saving time, so it’s important to thoroughly test your solution to ensure it handles all edge cases correctly.</p>
<p>If you’re frequently performing these types of conversions, you might want to consider storing datetime values in UTC directly in your database. This can simplify your data model and avoid potential issues with time zone conversions.</p>
<p><code>Question</code><br>
Does AT TIME ZONE have a default value that will alter depending on whether the UK is under British Summer time?</p>
<p><code>Answer</code><br>
Yes, the AT TIME ZONE clause in SQL Server does take daylight saving time into account. When you use a time zone name with this clause, it will automatically adjust the time based on the current daylight saving time rules for that time zone.</p>
<p>For example, if you use ‘GMT Standard Time’ (which is the time zone name for UK time in SQL Server), it will automatically show the correct offset for daylight saving when it is in effect.</p>
<p>Here’s an example:</p>
<div><div id="highlighter_218917" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">SELECT</code> <code class="sql plain">GETDATE() </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'GMT Standard Time'</code></div></div></td></tr></tbody></table></div></div>
<p>This will return the current date and time on the database BUT in my testing does NOT adjust the time to the timezone but will show the correct time zone OFFSET for the date for corrected for daylight saving i.e Greenwich Mean Time (GMT) or British Summer Time (BST), depending on the date.</p>
<p>Please note that the actual time zone names and their daylight saving time rules are based on the time zone data on the server where SQL Server is running. This data is updated through the Windows operating system, so it’s important to keep your servers up-to-date to ensure that the time zone rules are accurate.</p>
<p>And here are what I think are the supported time zones<br>
<a href="https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/timezones-overview?view=azuresql" rel="noopener" target="_blank">MS Azure supported time zone values</a></p>
<p><code>Post-script</code><br>
A lot of online editors won’t let you run the At Time Zone function but this one does..</p>
<p><a href="https://www.dofactory.com/sql/editor" rel="noopener" target="_blank">dofactory</a></p>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.jpg" alt="" width="742" height="622" class="aligncenter size-full wp-image-4182" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture.jpg 742w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-300x251.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Comparing the time to my location and the time where I am I can tell that this is Pacific Standard Time – i.e Western America – California perhaps.</p>
<p>We also note that the time isn’t adjusted to the stated timezone but we do see the offset (see +01:00 in record return) Again this is because per se it doesn’t tell you what the server is set to but by using the sysdatetimeoffset we can correct the server time back to UTC and the adjust for timezone see second code example. The Timezone although included in the time is again be stated.</p>
<div><div id="highlighter_292151" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">SELECT</code> <code class="sql plain">SYSDATETIMEOFFSET() </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'W. Europe Standard Time'</code> <code class="sql keyword">as</code> <code class="sql plain">WEuropeTime, </code></div><div class="line number2 index1 alt1"><code class="sql plain">SYSDATETIMEOFFSET() </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'GMT Standard Time'</code> <code class="sql keyword">as</code> <code class="sql plain">GMTStandard</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture1.jpg" alt="" width="824" height="666" class="aligncenter size-full wp-image-4184" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture1.jpg 824w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture1-300x242.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture1-768x621.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>And so there is a direction to timezone switch – In the above we have mainly been switching from UTC to a timezone but the below switches from a timezone to UTC which is what we will need if we are storing the input as a datetime and a separate timezone for each record.</p>
<div><div id="highlighter_719833" class="syntaxhighlighter sql"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="sql keyword">SELECT</code> <code class="sql plain">SWITCHOFFSET(GetDate() </code><code class="sql keyword">AT</code> <code class="sql keyword">TIME</code> <code class="sql plain">ZONE </code><code class="sql string">'Pacific Standard Time'</code><code class="sql plain">, </code><code class="sql string">'+00:00'</code><code class="sql plain">)</code></div></div></td></tr></tbody></table></div></div>
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-1.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-1.jpg" alt="" width="744" height="458" class="aligncenter size-full wp-image-4191" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-1.jpg 744w, https://cloudydatablog.net/wp-content/uploads/2023/11/Capture-1-300x185.jpg 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></a></p>
<p>Remember though timezones are held outside SQL Server databases on the server and as such are non deterministic. This is a good demonstration of determinism in practice</p>
<p>Deterministic algorithms are entirely predictable and always produce the same output for the same input.</p>
<p>Non-deterministic algorithms may produce different outputs for the same input due to random events or other factors.</p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/sql-server-computed-column-create-utc-datetime-value-from-datetime-timezone-field/" rel="bookmark"><time class="entry-date published" datetime="2023-11-08T21:21:02+00:00">08/11/2023</time><time class="updated" datetime="2023-11-09T10:16:31+00:00">09/11/2023</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/ai/" rel="category tag">AI</a>, <a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/sql-azure/" rel="category tag">SQL Azure</a>, <a href="https://cloudydatablog.net/category/sql-server/" rel="category tag">SQL Server</a>, <a href="https://cloudydatablog.net/category/ssms/" rel="category tag">SSMS</a>, <a href="https://cloudydatablog.net/category/tsql-scripts/" rel="category tag">TSQL scripts</a>, <a href="https://cloudydatablog.net/category/tsql-user-defined-function/" rel="category tag">TSQL User Defined Function</a>, <a href="https://cloudydatablog.net/category/zagon/" rel="category tag">Zagon</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4168 -->
<article id="post-4150" class="post-4150 post type-post status-publish format-standard hentry category-all category-ms-azure-dev-ops category-ms-azure-web-app category-my-design-patterns category-personal-development category-sql-azure category-sql-server category-ssms">
<header class="entry-header">
<h2 class="entry-title"><a href="https://cloudydatablog.net/database-time-on-servers/" rel="bookmark">Databases and Time – Time Zones are not Datatypes</a></h2> </header><!-- .entry-header -->
<div class="entry-content">
<p><a href="https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753.jpg"><img loading="lazy" decoding="async" src="https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753.jpg" alt="" width="1024" height="1024" class="aligncenter size-full wp-image-4151" srcset="https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753.jpg 1024w, https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753-300x300.jpg 300w, https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753-150x150.jpg 150w, https://cloudydatablog.net/wp-content/uploads/2023/11/2158517f-6e08-4920-8098-db95ef51e753-768x768.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px"></a></p>
<p>When working with time in databases and web applications we should recognise that time zones are NOT a datatype. They represent an important part of a datetime value that links to a datetime value and may represent the time on the server or the time in the browser or some time in a particular country for an attribute of a record. Simply viewing a datetime value individually is incomplete if users are entering data from all over the world. If this is not designed into the schema from the beginning problems may be presented when filtering and ordering records based on datetime. </p>
<p>Does your application have users within the same or different time zones? Is your database hosted in the same or a different time zone?</p>
<p>SQL Azure database servers for instance only allow for a default time zone set to UTC. This means wherever you are in the world if you set a default value on an datetime field new records will record time at UTC. This can present issues where users submit values based on a different localised time. </p>
<p>Default values that are set to GetDate() can be out by a given time offset. Additionally web interfaces which set the datetime value at input may be set by the browser and if the browser is not on UTC that time will use a clock that may be forward or behind UTC. What’s the solution? My suggestion is to record the time zone in a separate field per record to the datetime value and then use a view to convert all datetimes to a common time zone field (probably best UTC). At least that should reduce complexity for users. Developer and users should be aware as this could be confusing when a user inputs a time into a database and then is presented with the UTC value when viewing the value.</p>
<p>It should be noted that Azure Logic Apps are on a server that is not set to UTC but local time (in my case London / Europe) I suspect that whatever local you set will be affect the local time. This led to a situation where in British Summer Time a logic app procedure triggered for 10pm was showing 9pm in the database – the BST offset.</p>
<p>Repeat after me – Time Zones are not Datatypes</p>
<p>And here is a nice site that identifies differences from UTC of timezones based on URL parameters</p>
<p>Time around the world<br>
<a href="https://mytime.io/10am/BST" rel="noopener" target="_blank">British Summer Time – 10am UTC</a></p>
<p><a href="https://mytime.io/10am/EST" rel="noopener" target="_blank">Eastern Seaboard Time – 10am UTC</a></p>
<p><a href="https://mytime.io/10am/AEDT" rel="noopener" target="_blank">Sydney Australia – Aussie Eastern Daylight Time – 10am UTC</a></p>
</div><!-- .entry-content -->
<footer class="entry-footer">
<span class="byline"><span class="screen-reader-text">Author </span><span class="author vcard"><a class="url fn n" href="https://cloudydatablog.net/author/mark/">Mark</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://cloudydatablog.net/database-time-on-servers/" rel="bookmark"><time class="entry-date published" datetime="2023-11-08T09:18:25+00:00">08/11/2023</time><time class="updated" datetime="2023-11-08T16:03:55+00:00">08/11/2023</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://cloudydatablog.net/category/all/" rel="category tag">All</a>, <a href="https://cloudydatablog.net/category/ms-azure-dev-ops/" rel="category tag">MS Azure Dev Ops</a>, <a href="https://cloudydatablog.net/category/ms-azure-web-app/" rel="category tag">MS Azure Web App</a>, <a href="https://cloudydatablog.net/category/my-design-patterns/" rel="category tag">My Design Patterns</a>, <a href="https://cloudydatablog.net/category/personal-development/" rel="category tag">Personal Development</a>, <a href="https://cloudydatablog.net/category/sql-azure/" rel="category tag">SQL Azure</a>, <a href="https://cloudydatablog.net/category/sql-server/" rel="category tag">SQL Server</a>, <a href="https://cloudydatablog.net/category/ssms/" rel="category tag">SSMS</a></span> </footer><!-- .entry-footer -->
</article><!-- #post-4150 -->
<nav class="navigation pagination" aria-label="Posts pagination">
<h2 class="screen-reader-text">Posts pagination</h2>
<div class="nav-links"><span aria-current="page" class="page-numbers current"><span class="meta-nav screen-reader-text">Page </span>1</span>
<a class="page-numbers" href="https://cloudydatablog.net/page/2/"><span class="meta-nav screen-reader-text">Page </span>2</a>
<span class="page-numbers dots">…</span>
<a class="page-numbers" href="https://cloudydatablog.net/page/15/"><span class="meta-nav screen-reader-text">Page </span>15</a>
<a class="next page-numbers" href="https://cloudydatablog.net/page/2/">Next page</a></div>
</nav>
</main><!-- .site-main -->
</div><!-- .content-area -->
<aside id="secondary" class="sidebar widget-area">
<section id="search-6" class="widget widget_search">
<form role="search" method="get" class="search-form" action="https://cloudydatablog.net/">
<label>
<span class="screen-reader-text">
Search for: </span>
<input type="search" class="search-field" placeholder="Search …" value="" name="s">
</label>
<button type="submit" class="search-submit"><span class="screen-reader-text">
Search </span></button>
</form>
</section>
<section id="recent-posts-3" class="widget widget_recent_entries">
<h2 class="widget-title">Recent Posts</h2><nav aria-label="Recent Posts">
<ul>
<li>
<a href="https://cloudydatablog.net/postgres-alter-default-database/">Postgres : Adjust default Database to inherit PostGIS and pgRouting on CREATE</a>
</li>
<li>
<a href="https://cloudydatablog.net/geoserver-create-view/">Geoserver – CREATE View</a>
</li>
<li>
<a href="https://cloudydatablog.net/postgres-create-table-syntax-best-practice/">Postgres : Create Table SQL Syntax Best Practice</a>
</li>
<li>
<a href="https://cloudydatablog.net/cpanel-just-gets-better-and-better/">cPanel – Just gets better and better</a>
</li>
<li>
<a href="https://cloudydatablog.net/device-name-quickest-ways-to-identify-on-windows-x64/">Device Name – Quickest ways to Identify on Windows x64</a>
</li>
<li>
<a href="https://cloudydatablog.net/10-years-of-writing-my-thoughts/">WP Handy plug in for counting your posts…</a>
</li>
<li>
<a href="https://cloudydatablog.net/geoserver-and-oracle-wfs-wms-config-tips/">GeoServer and ORACLE – WFS & WMS Config Tips</a>
</li>
<li>
<a href="https://cloudydatablog.net/installation-and-configuration-of-geoserver-for-sql-azure-on-windows-should-work-for-any-sql-server-instance/">Geoserver Installation (Configuration for SQL Server on Windows)</a>
</li>
<li>
<a href="https://cloudydatablog.net/spatial-data-hub-scotland/">Spatial Data Hub Scotland</a>
</li>
<li>
<a href="https://cloudydatablog.net/additional-css-for-wordpress/">Additional CSS for WordPress</a>
</li>
</ul>
</nav></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives">
<ul>
<li><a href="https://cloudydatablog.net/2024/10/">October 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/07/">July 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/06/">June 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/05/">May 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/04/">April 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/03/">March 2024</a> (2)</li>
<li><a href="https://cloudydatablog.net/2024/01/">January 2024</a> (5)</li>
<li><a href="https://cloudydatablog.net/2023/12/">December 2023</a> (4)</li>
<li><a href="https://cloudydatablog.net/2023/11/">November 2023</a> (4)</li>
<li><a href="https://cloudydatablog.net/2023/10/">October 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/09/">September 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/08/">August 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/07/">July 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/06/">June 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/04/">April 2023</a> (3)</li>
<li><a href="https://cloudydatablog.net/2023/03/">March 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/02/">February 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/01/">January 2023</a> (3)</li>
<li><a href="https://cloudydatablog.net/2022/12/">December 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/11/">November 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/07/">July 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/05/">May 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/04/">April 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/03/">March 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/02/">February 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/01/">January 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/12/">December 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/11/">November 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/10/">October 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/09/">September 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/07/">July 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/06/">June 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/05/">May 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/04/">April 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/03/">March 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/02/">February 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/12/">December 2020</a> (3)</li>
<li><a href="https://cloudydatablog.net/2020/11/">November 2020</a> (4)</li>
<li><a href="https://cloudydatablog.net/2020/10/">October 2020</a> (6)</li>
<li><a href="https://cloudydatablog.net/2020/09/">September 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/08/">August 2020</a> (2)</li>
<li><a href="https://cloudydatablog.net/2020/06/">June 2020</a> (2)</li>
<li><a href="https://cloudydatablog.net/2020/05/">May 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/03/">March 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/01/">January 2020</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/12/">December 2019</a> (2)</li>
<li><a href="https://cloudydatablog.net/2019/11/">November 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/09/">September 2019</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/07/">July 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/06/">June 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/05/">May 2019</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/04/">April 2019</a> (5)</li>
<li><a href="https://cloudydatablog.net/2019/03/">March 2019</a> (4)</li>
<li><a href="https://cloudydatablog.net/2019/02/">February 2019</a> (13)</li>
<li><a href="https://cloudydatablog.net/2018/12/">December 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/11/">November 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/09/">September 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/08/">August 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/05/">May 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/04/">April 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/03/">March 2018</a> (6)</li>
<li><a href="https://cloudydatablog.net/2018/02/">February 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/01/">January 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/11/">November 2017</a> (4)</li>
<li><a href="https://cloudydatablog.net/2017/10/">October 2017</a> (2)</li>
<li><a href="https://cloudydatablog.net/2017/09/">September 2017</a> (3)</li>
<li><a href="https://cloudydatablog.net/2017/08/">August 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/07/">July 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/06/">June 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/04/">April 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/03/">March 2017</a> (6)</li>
<li><a href="https://cloudydatablog.net/2017/02/">February 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/01/">January 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/12/">December 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2016/11/">November 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/10/">October 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/07/">July 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/06/">June 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/04/">April 2016</a> (7)</li>
<li><a href="https://cloudydatablog.net/2016/03/">March 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2016/02/">February 2016</a> (3)</li>
<li><a href="https://cloudydatablog.net/2016/01/">January 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/12/">December 2015</a> (3)</li>
<li><a href="https://cloudydatablog.net/2015/08/">August 2015</a> (1)</li>
<li><a href="https://cloudydatablog.net/2015/07/">July 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/06/">June 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2015/05/">May 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2015/04/">April 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/03/">March 2015</a> (5)</li>
<li><a href="https://cloudydatablog.net/2015/02/">February 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/01/">January 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2014/12/">December 2014</a> (2)</li>
<li><a href="https://cloudydatablog.net/2014/11/">November 2014</a> (4)</li>
<li><a href="https://cloudydatablog.net/2014/10/">October 2014</a> (8)</li>
<li><a href="https://cloudydatablog.net/2014/09/">September 2014</a> (3)</li>
<li><a href="https://cloudydatablog.net/2014/08/">August 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/07/">July 2014</a> (6)</li>
<li><a href="https://cloudydatablog.net/2014/06/">June 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/05/">May 2014</a> (12)</li>
<li><a href="https://cloudydatablog.net/2014/04/">April 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/03/">March 2014</a> (3)</li>
<li><a href="https://cloudydatablog.net/2014/01/">January 2014</a> (5)</li>
</ul>
</nav></section><section id="categories-2" class="widget widget_categories"><h2 class="widget-title">Categories</h2><nav aria-label="Categories">
<ul>
<li class="cat-item cat-item-79"><a href="https://cloudydatablog.net/category/address-matching/">Address Matching</a> (8)
</li>
<li class="cat-item cat-item-119"><a href="https://cloudydatablog.net/category/ai/">AI</a> (3)
</li>
<li class="cat-item cat-item-44"><a href="https://cloudydatablog.net/category/all/">All</a> (277)
</li>
<li class="cat-item cat-item-94"><a href="https://cloudydatablog.net/category/analysis/">Analysis</a> (6)
</li>
<li class="cat-item cat-item-32"><a href="https://cloudydatablog.net/category/applied-mathematics/">Applied Mathematics</a> (4)
</li>
<li class="cat-item cat-item-88"><a href="https://cloudydatablog.net/category/asp-net-runner/">ASP-NET Runner</a> (3)
</li>
<li class="cat-item cat-item-55"><a href="https://cloudydatablog.net/category/autohotkey/">AutoHotKey</a> (3)
</li>
<li class="cat-item cat-item-118"><a href="https://cloudydatablog.net/category/automation/">Automation</a> (2)
</li>
<li class="cat-item cat-item-115"><a href="https://cloudydatablog.net/category/azure-automation/">Azure Automation</a> (8)
</li>
<li class="cat-item cat-item-126"><a href="https://cloudydatablog.net/category/azure-database-for-postgres-flexible-server/">Azure Database for Postgres Flexible Server</a> (1)
</li>
<li class="cat-item cat-item-8"><a href="https://cloudydatablog.net/category/backup/">Backup</a> (9)
</li>
<li class="cat-item cat-item-104"><a href="https://cloudydatablog.net/category/bacpac/">bacpac</a> (2)
</li>
<li class="cat-item cat-item-122"><a href="https://cloudydatablog.net/category/bat/">bat</a> (1)
</li>
<li class="cat-item cat-item-78"><a href="https://cloudydatablog.net/category/chrome/">Chrome</a> (4)
</li>
<li class="cat-item cat-item-75"><a href="https://cloudydatablog.net/category/code-generators/">Code Generators</a> (2)
</li>
<li class="cat-item cat-item-21"><a href="https://cloudydatablog.net/category/configuration/">Configuration</a> (28)
</li>
<li class="cat-item cat-item-54"><a href="https://cloudydatablog.net/category/continual-professional-development/">Continual Professional Development</a> (13)
</li>
<li class="cat-item cat-item-105"><a href="https://cloudydatablog.net/category/cpanel/">CPANEL</a> (7)
</li>
<li class="cat-item cat-item-110"><a href="https://cloudydatablog.net/category/cron/">CRON</a> (1)
</li>
<li class="cat-item cat-item-108"><a href="https://cloudydatablog.net/category/crud/">CRUD</a> (3)
</li>
<li class="cat-item cat-item-136"><a href="https://cloudydatablog.net/category/css/">CSS</a> (1)
</li>
<li class="cat-item cat-item-59"><a href="https://cloudydatablog.net/category/data-cleansing/">Data Cleansing</a> (6)
</li>
<li class="cat-item cat-item-84"><a href="https://cloudydatablog.net/category/data-mining/">Data Mining</a> (5)
</li>
<li class="cat-item cat-item-25"><a href="https://cloudydatablog.net/category/database-design/">Database Design</a> (45)
</li>
<li class="cat-item cat-item-49"><a href="https://cloudydatablog.net/category/dev-ops/">Dev Ops</a> (31)
</li>
<li class="cat-item cat-item-10"><a href="https://cloudydatablog.net/category/digital-mapping/">Digital Mapping</a> (6)
</li>
<li class="cat-item cat-item-45"><a href="https://cloudydatablog.net/category/dot-net-framework/">dot NET framework</a> (2)
</li>
<li class="cat-item cat-item-50"><a href="https://cloudydatablog.net/category/e-mail/">E-mail</a> (3)
</li>
<li class="cat-item cat-item-34"><a href="https://cloudydatablog.net/category/excel/">Excel</a> (1)
</li>
<li class="cat-item cat-item-52"><a href="https://cloudydatablog.net/category/finance/">Finance</a> (1)
</li>
<li class="cat-item cat-item-53"><a href="https://cloudydatablog.net/category/formula/">Formula</a> (1)
</li>
<li class="cat-item cat-item-17"><a href="https://cloudydatablog.net/category/general/">General Opinion</a> (24)
</li>
<li class="cat-item cat-item-12"><a href="https://cloudydatablog.net/category/geographical-information-systems/">Geographical Information Systems</a> (24)
</li>
<li class="cat-item cat-item-134"><a href="https://cloudydatablog.net/category/geoserver/">Geoserver</a> (4)
</li>
<li class="cat-item cat-item-11"><a href="https://cloudydatablog.net/category/gis/">GIS</a> (23)
</li>
<li class="cat-item cat-item-98"><a href="https://cloudydatablog.net/category/github/">GITHUB</a> (2)
</li>
<li class="cat-item cat-item-81"><a href="https://cloudydatablog.net/category/javascript/">Javascript</a> (4)
</li>
<li class="cat-item cat-item-38"><a href="https://cloudydatablog.net/category/learning/">Learning</a> (4)
</li>
<li class="cat-item cat-item-76"><a href="https://cloudydatablog.net/category/low-coding-platforms/">Low Coding Platforms</a> (9)
</li>
<li class="cat-item cat-item-107"><a href="https://cloudydatablog.net/category/mariadb/">MariaDB</a> (5)
</li>
<li class="cat-item cat-item-28"><a href="https://cloudydatablog.net/category/ms-access/">MS Access</a> (64)
</li>
<li class="cat-item cat-item-127"><a href="https://cloudydatablog.net/category/ms-azure-dev-ops/">MS Azure Dev Ops</a> (3)
</li>
<li class="cat-item cat-item-100"><a href="https://cloudydatablog.net/category/ms-azure-web-app/">MS Azure Web App</a> (4)
</li>
<li class="cat-item cat-item-42"><a href="https://cloudydatablog.net/category/my-design-patterns/">My Design Patterns</a> (1)
</li>
<li class="cat-item cat-item-43"><a href="https://cloudydatablog.net/category/my-ui-design-patterns/">My UI Design Patterns</a> (8)
</li>
<li class="cat-item cat-item-80"><a href="https://cloudydatablog.net/category/mysql/">MySQL</a> (5)
</li>
<li class="cat-item cat-item-31"><a href="https://cloudydatablog.net/category/networking-and-cabling/">Networking and Cabling</a> (3)
</li>
<li class="cat-item cat-item-82"><a href="https://cloudydatablog.net/category/normalisation/">Normalisation</a> (3)
</li>
<li class="cat-item cat-item-97"><a href="https://cloudydatablog.net/category/nubuilder/">nubuilder</a> (3)
</li>
<li class="cat-item cat-item-72"><a href="https://cloudydatablog.net/category/nubuilderpro/">nuBuilderPro</a> (4)
</li>
<li class="cat-item cat-item-129"><a href="https://cloudydatablog.net/category/oceanwp/">OceanWP</a> (1)
</li>
<li class="cat-item cat-item-35"><a href="https://cloudydatablog.net/category/open-source/">Open Source</a> (6)
</li>
<li class="cat-item cat-item-135"><a href="https://cloudydatablog.net/category/oracle/">ORACLE</a> (1)
</li>
<li class="cat-item cat-item-85"><a href="https://cloudydatablog.net/category/password-protected/">Password Protected</a> (2)
</li>
<li class="cat-item cat-item-39"><a href="https://cloudydatablog.net/category/personal-development/">Personal Development</a> (10)
</li>
<li class="cat-item cat-item-93"><a href="https://cloudydatablog.net/category/pgrouting/">pgrouting</a> (11)
</li>
<li class="cat-item cat-item-109"><a href="https://cloudydatablog.net/category/php/">php</a> (5)
</li>
<li class="cat-item cat-item-106"><a href="https://cloudydatablog.net/category/phpmyadmin/">phpmyadmin</a> (1)
</li>
<li class="cat-item cat-item-111"><a href="https://cloudydatablog.net/category/phprunner/">PHPRunner</a> (6)
</li>
<li class="cat-item cat-item-57"><a href="https://cloudydatablog.net/category/postgis/">PostGIS</a> (31)
</li>
<li class="cat-item cat-item-56"><a href="https://cloudydatablog.net/category/postgres/">Postgres</a> (36)
</li>
<li class="cat-item cat-item-112"><a href="https://cloudydatablog.net/category/powershell/">Powershell</a> (1)
</li>
<li class="cat-item cat-item-7"><a href="https://cloudydatablog.net/category/problem-solving/">Problem Solving</a> (12)
</li>
<li class="cat-item cat-item-5"><a href="https://cloudydatablog.net/category/productivity/">Productivity</a> (21)
</li>
<li class="cat-item cat-item-22"><a href="https://cloudydatablog.net/category/programming/">Programming</a> (11)
</li>
<li class="cat-item cat-item-51"><a href="https://cloudydatablog.net/category/project-management/">Project Management</a> (6)
</li>
<li class="cat-item cat-item-89"><a href="https://cloudydatablog.net/category/psql/">psql</a> (26)
</li>
<li class="cat-item cat-item-37"><a href="https://cloudydatablog.net/category/qgis-2-2/">QGIS 2.2</a> (1)
</li>
<li class="cat-item cat-item-58"><a href="https://cloudydatablog.net/category/qgis-2-8-1/">QGIS 2.8.1</a> (5)
</li>
<li class="cat-item cat-item-36"><a href="https://cloudydatablog.net/category/qgis/">QGIS General</a> (22)
</li>
<li class="cat-item cat-item-77"><a href="https://cloudydatablog.net/category/rad-web-tools/">RAD Web Tools</a> (2)
</li>
<li class="cat-item cat-item-121"><a href="https://cloudydatablog.net/category/reliability-update-azure-logic-apps/">Reliability Update-Azure Logic Apps</a> (1)
</li>
<li class="cat-item cat-item-133"><a href="https://cloudydatablog.net/category/rtpi-gis/">RTPI – GIS</a> (27)
</li>
<li class="cat-item cat-item-132"><a href="https://cloudydatablog.net/category/rtpi-list/">RTPI List</a> (13)
</li>
<li class="cat-item cat-item-113"><a href="https://cloudydatablog.net/category/runbook/">Runbook</a> (2)
</li>
<li class="cat-item cat-item-114"><a href="https://cloudydatablog.net/category/scheduled-procedures/">Scheduled Procedures</a> (1)
</li>
<li class="cat-item cat-item-90"><a href="https://cloudydatablog.net/category/search/">Search</a> (1)
</li>
<li class="cat-item cat-item-117"><a href="https://cloudydatablog.net/category/security/">Security</a> (2)
</li>
<li class="cat-item cat-item-46"><a href="https://cloudydatablog.net/category/software-purchase/">Software Purchase</a> (2)
</li>
<li class="cat-item cat-item-30"><a href="https://cloudydatablog.net/category/sql-08-r2/">SQL 08 R2</a> (13)
</li>
<li class="cat-item cat-item-74"><a href="https://cloudydatablog.net/category/sql-azure/">SQL Azure</a> (51)
</li>
<li class="cat-item cat-item-131"><a href="https://cloudydatablog.net/category/sql-azure-trigger/">SQL Azure Trigger</a> (1)
</li>
<li class="cat-item cat-item-40"><a href="https://cloudydatablog.net/category/sql-ms-access/">SQL MS Access</a> (9)
</li>
<li class="cat-item cat-item-27"><a href="https://cloudydatablog.net/category/sql-server/">SQL Server</a> (57)
</li>
<li class="cat-item cat-item-29"><a href="https://cloudydatablog.net/category/ssms/">SSMS</a> (44)
</li>
<li class="cat-item cat-item-128"><a href="https://cloudydatablog.net/category/sweet-alert/">Sweet Alert</a> (2)
</li>
<li class="cat-item cat-item-20"><a href="https://cloudydatablog.net/category/the-future-of-software/">The future of software</a> (5)
</li>
<li class="cat-item cat-item-83"><a href="https://cloudydatablog.net/category/tsql-scripts/">TSQL scripts</a> (36)
</li>
<li class="cat-item cat-item-101"><a href="https://cloudydatablog.net/category/tsql-user-defined-function/">TSQL User Defined Function</a> (10)
</li>
<li class="cat-item cat-item-87"><a href="https://cloudydatablog.net/category/uniform/">Uniform</a> (1)
</li>
<li class="cat-item cat-item-48"><a href="https://cloudydatablog.net/category/useful-links/">Useful Links</a> (2)
</li>
<li class="cat-item cat-item-26"><a href="https://cloudydatablog.net/category/user-interface-design/">User Interface Design</a> (3)
</li>
<li class="cat-item cat-item-16"><a href="https://cloudydatablog.net/category/vba-code/">VBA Code MS Access</a> (64)
</li>
<li class="cat-item cat-item-33"><a href="https://cloudydatablog.net/category/vba-code-excel/">VBA Code MS Excel</a> (2)
</li>
<li class="cat-item cat-item-9"><a href="https://cloudydatablog.net/category/vbs-scripts/">VBS Scripts</a> (7)
</li>
<li class="cat-item cat-item-99"><a href="https://cloudydatablog.net/category/web-applications/">Web Applications</a> (3)
</li>
<li class="cat-item cat-item-47"><a href="https://cloudydatablog.net/category/win-8-1/">Win 8.1</a> (2)
</li>
<li class="cat-item cat-item-103"><a href="https://cloudydatablog.net/category/windows-10/">Windows 10</a> (1)
</li>
<li class="cat-item cat-item-102"><a href="https://cloudydatablog.net/category/wordpress/">Wordpress</a> (4)
</li>
<li class="cat-item cat-item-120"><a href="https://cloudydatablog.net/category/zagon/">Zagon</a> (9)
</li>
<li class="cat-item cat-item-24"><a href="https://cloudydatablog.net/category/%d1%80%d1%83%d1%81%d1%81%d0%ba%d0%b8%d0%b9/">Русский</a> (3)
</li>
</ul>
</nav></section><section id="search-3" class="widget widget_search">
<form role="search" method="get" class="search-form" action="https://cloudydatablog.net/">
<label>
<span class="screen-reader-text">
Search for: </span>
<input type="search" class="search-field" placeholder="Search …" value="" name="s">
</label>
<button type="submit" class="search-submit"><span class="screen-reader-text">
Search </span></button>
</form>
</section>
<section id="recent-posts-3" class="widget widget_recent_entries">
<h2 class="widget-title">Recent Posts</h2><nav aria-label="Recent Posts">
<ul>
<li>
<a href="https://cloudydatablog.net/postgres-alter-default-database/">Postgres : Adjust default Database to inherit PostGIS and pgRouting on CREATE</a>
</li>
<li>
<a href="https://cloudydatablog.net/geoserver-create-view/">Geoserver – CREATE View</a>
</li>
<li>
<a href="https://cloudydatablog.net/postgres-create-table-syntax-best-practice/">Postgres : Create Table SQL Syntax Best Practice</a>
</li>
<li>
<a href="https://cloudydatablog.net/cpanel-just-gets-better-and-better/">cPanel – Just gets better and better</a>
</li>
<li>
<a href="https://cloudydatablog.net/device-name-quickest-ways-to-identify-on-windows-x64/">Device Name – Quickest ways to Identify on Windows x64</a>
</li>
<li>
<a href="https://cloudydatablog.net/10-years-of-writing-my-thoughts/">WP Handy plug in for counting your posts…</a>
</li>
<li>
<a href="https://cloudydatablog.net/geoserver-and-oracle-wfs-wms-config-tips/">GeoServer and ORACLE – WFS & WMS Config Tips</a>
</li>
<li>
<a href="https://cloudydatablog.net/installation-and-configuration-of-geoserver-for-sql-azure-on-windows-should-work-for-any-sql-server-instance/">Geoserver Installation (Configuration for SQL Server on Windows)</a>
</li>
<li>
<a href="https://cloudydatablog.net/spatial-data-hub-scotland/">Spatial Data Hub Scotland</a>
</li>
<li>
<a href="https://cloudydatablog.net/additional-css-for-wordpress/">Additional CSS for WordPress</a>
</li>
</ul>
</nav></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives">
<ul>
<li><a href="https://cloudydatablog.net/2024/10/">October 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/07/">July 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/06/">June 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/05/">May 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/04/">April 2024</a> (1)</li>
<li><a href="https://cloudydatablog.net/2024/03/">March 2024</a> (2)</li>
<li><a href="https://cloudydatablog.net/2024/01/">January 2024</a> (5)</li>
<li><a href="https://cloudydatablog.net/2023/12/">December 2023</a> (4)</li>
<li><a href="https://cloudydatablog.net/2023/11/">November 2023</a> (4)</li>
<li><a href="https://cloudydatablog.net/2023/10/">October 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/09/">September 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/08/">August 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/07/">July 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/06/">June 2023</a> (1)</li>
<li><a href="https://cloudydatablog.net/2023/04/">April 2023</a> (3)</li>
<li><a href="https://cloudydatablog.net/2023/03/">March 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/02/">February 2023</a> (2)</li>
<li><a href="https://cloudydatablog.net/2023/01/">January 2023</a> (3)</li>
<li><a href="https://cloudydatablog.net/2022/12/">December 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/11/">November 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/07/">July 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/05/">May 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/04/">April 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/03/">March 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2022/02/">February 2022</a> (1)</li>
<li><a href="https://cloudydatablog.net/2022/01/">January 2022</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/12/">December 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/11/">November 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/10/">October 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/09/">September 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/07/">July 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/06/">June 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/05/">May 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2021/04/">April 2021</a> (2)</li>
<li><a href="https://cloudydatablog.net/2021/03/">March 2021</a> (3)</li>
<li><a href="https://cloudydatablog.net/2021/02/">February 2021</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/12/">December 2020</a> (3)</li>
<li><a href="https://cloudydatablog.net/2020/11/">November 2020</a> (4)</li>
<li><a href="https://cloudydatablog.net/2020/10/">October 2020</a> (6)</li>
<li><a href="https://cloudydatablog.net/2020/09/">September 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/08/">August 2020</a> (2)</li>
<li><a href="https://cloudydatablog.net/2020/06/">June 2020</a> (2)</li>
<li><a href="https://cloudydatablog.net/2020/05/">May 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/03/">March 2020</a> (1)</li>
<li><a href="https://cloudydatablog.net/2020/01/">January 2020</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/12/">December 2019</a> (2)</li>
<li><a href="https://cloudydatablog.net/2019/11/">November 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/09/">September 2019</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/07/">July 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/06/">June 2019</a> (1)</li>
<li><a href="https://cloudydatablog.net/2019/05/">May 2019</a> (3)</li>
<li><a href="https://cloudydatablog.net/2019/04/">April 2019</a> (5)</li>
<li><a href="https://cloudydatablog.net/2019/03/">March 2019</a> (4)</li>
<li><a href="https://cloudydatablog.net/2019/02/">February 2019</a> (13)</li>
<li><a href="https://cloudydatablog.net/2018/12/">December 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/11/">November 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/09/">September 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/08/">August 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/05/">May 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/04/">April 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2018/03/">March 2018</a> (6)</li>
<li><a href="https://cloudydatablog.net/2018/02/">February 2018</a> (2)</li>
<li><a href="https://cloudydatablog.net/2018/01/">January 2018</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/11/">November 2017</a> (4)</li>
<li><a href="https://cloudydatablog.net/2017/10/">October 2017</a> (2)</li>
<li><a href="https://cloudydatablog.net/2017/09/">September 2017</a> (3)</li>
<li><a href="https://cloudydatablog.net/2017/08/">August 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/07/">July 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/06/">June 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/04/">April 2017</a> (5)</li>
<li><a href="https://cloudydatablog.net/2017/03/">March 2017</a> (6)</li>
<li><a href="https://cloudydatablog.net/2017/02/">February 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2017/01/">January 2017</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/12/">December 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2016/11/">November 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/10/">October 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/07/">July 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/06/">June 2016</a> (1)</li>
<li><a href="https://cloudydatablog.net/2016/04/">April 2016</a> (7)</li>
<li><a href="https://cloudydatablog.net/2016/03/">March 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2016/02/">February 2016</a> (3)</li>
<li><a href="https://cloudydatablog.net/2016/01/">January 2016</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/12/">December 2015</a> (3)</li>
<li><a href="https://cloudydatablog.net/2015/08/">August 2015</a> (1)</li>
<li><a href="https://cloudydatablog.net/2015/07/">July 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/06/">June 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2015/05/">May 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2015/04/">April 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/03/">March 2015</a> (5)</li>
<li><a href="https://cloudydatablog.net/2015/02/">February 2015</a> (2)</li>
<li><a href="https://cloudydatablog.net/2015/01/">January 2015</a> (4)</li>
<li><a href="https://cloudydatablog.net/2014/12/">December 2014</a> (2)</li>
<li><a href="https://cloudydatablog.net/2014/11/">November 2014</a> (4)</li>
<li><a href="https://cloudydatablog.net/2014/10/">October 2014</a> (8)</li>
<li><a href="https://cloudydatablog.net/2014/09/">September 2014</a> (3)</li>
<li><a href="https://cloudydatablog.net/2014/08/">August 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/07/">July 2014</a> (6)</li>
<li><a href="https://cloudydatablog.net/2014/06/">June 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/05/">May 2014</a> (12)</li>
<li><a href="https://cloudydatablog.net/2014/04/">April 2014</a> (7)</li>
<li><a href="https://cloudydatablog.net/2014/03/">March 2014</a> (3)</li>
<li><a href="https://cloudydatablog.net/2014/01/">January 2014</a> (5)</li>
</ul>
</nav></section> </aside><!-- .sidebar .widget-area -->
</div><!-- .site-content -->
<footer id="colophon" class="site-footer">
<nav class="main-navigation" aria-label="Footer primary menu">
<div class="menu-main-menu-container"><ul id="menu-main-menu-1" class="primary-menu"><li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-2244"><a href="https://cloudydatablog.net" aria-current="page">Home</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3776" aria-haspopup="true"><a href="https://cloudydatablog.net/category/mariadb/">MariaDB</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3780"><a href="https://cloudydatablog.net/category/mariadb/">MariaDB</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3781"><a href="https://cloudydatablog.net/category/mysql/">MySQL</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3783"><a href="https://cloudydatablog.net/category/phpmyadmin/">phpmyadmin</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3772" aria-haspopup="true"><a href="https://cloudydatablog.net/category/ms-access/">MS Access</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3778"><a href="https://cloudydatablog.net/category/ms-access/">MS Access</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3768"><a href="https://cloudydatablog.net/category/vba-code/">VBA Code MS Access</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3773" aria-haspopup="true"><a href="https://cloudydatablog.net/category/postgres/">Postgres</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3779"><a href="https://cloudydatablog.net/category/postgres/">Postgres</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3774"><a href="https://cloudydatablog.net/category/postgis/">PostGIS</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3782"><a href="https://cloudydatablog.net/category/pgrouting/">pgrouting</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3784"><a href="https://cloudydatablog.net/category/psql/">psql</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-3771" aria-haspopup="true"><a href="https://cloudydatablog.net/category/sql-server/">SQL Server</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3767"><a href="https://cloudydatablog.net/category/sql-azure/">SQL Azure</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3793"><a href="https://cloudydatablog.net/category/sql-server/">SQL Server</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3770"><a href="https://cloudydatablog.net/category/ssms/">SSMS</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3769"><a href="https://cloudydatablog.net/category/tsql-scripts/">TSQL scripts</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3775"><a href="https://cloudydatablog.net/category/tsql-user-defined-function/">TSQL User Defined Function</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-post_type menu-item-object-post menu-item-2258"><a href="https://cloudydatablog.net/search/">Search</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2257" aria-haspopup="true"><a href="https://cloudydatablog.net/sample-page/">About Me</a><button class="dropdown-toggle" aria-expanded="false"><span class="screen-reader-text">expand child menu</span></button>
<ul class="sub-menu">
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3777"><a href="https://cloudydatablog.net/sample-page/">About Me</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2251"><a href="https://cloudydatablog.net/photo/">Photos</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2726"><a href="https://cloudydatablog.net/useful-links/">Useful Links</a></li>
</ul>
</li>
</ul></div> </nav><!-- .main-navigation -->
<div class="site-info">
<span class="site-title"><a href="https://cloudydatablog.net/" rel="home">Cloudy DATA Blog</a></span>
<a href="https://en-gb.wordpress.org/" class="imprint">
Proudly powered by WordPress </a>
</div><!-- .site-info -->
</footer><!-- .site-footer -->
</div><!-- .site-inner -->
</div><!-- .site -->
<script src="https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shCore.js?ver=3.0.9b" id="syntaxhighlighter-core-js"></script>
<script src="https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushSql.js?ver=3.0.9b" id="syntaxhighlighter-brush-sql-js"></script>
<script src="https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushCss.js?ver=3.0.9b" id="syntaxhighlighter-brush-css-js"></script>
<script type="text/javascript">
(function(){
var corecss = document.createElement('link');
var themecss = document.createElement('link');
var corecssurl = "https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
if ( corecss.setAttribute ) {
corecss.setAttribute( "rel", "stylesheet" );
corecss.setAttribute( "type", "text/css" );
corecss.setAttribute( "href", corecssurl );
} else {
corecss.rel = "stylesheet";
corecss.href = corecssurl;
}
document.head.appendChild( corecss );
var themecssurl = "https://cloudydatablog.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?ver=3.0.9b";
if ( themecss.setAttribute ) {
themecss.setAttribute( "rel", "stylesheet" );
themecss.setAttribute( "type", "text/css" );
themecss.setAttribute( "href", themecssurl );
} else {
themecss.rel = "stylesheet";
themecss.href = themecssurl;
}
document.head.appendChild( themecss );
})();
SyntaxHighlighter.config.strings.expandSource = '+ expand source';
SyntaxHighlighter.config.strings.help = '?';
SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
SyntaxHighlighter.defaults['pad-line-numbers'] = false;
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
// Infinite scroll support
if ( typeof( jQuery ) !== 'undefined' ) {
jQuery( function( $ ) {
$( document.body ).on( 'post-load', function() {
SyntaxHighlighter.highlight();
} );
} );
}
</script>
</body></html><!-- Page supported by LiteSpeed Cache 6.5.2 on 2024-12-03 21:12:04 -->