Philipp Salvisberg

66 Followers
40 Following
80 Posts
Focused on database-centric development.
Websitehttps://www.salvis.com/blog/
Pronounshe/him
Gravatarhttps://en.gravatar.com/philippsalvisberg

Most Java CLI tools stop at mvn compile exec:java.

That works locally. It doesn’t scale.

In this guide I show how to:
- build a fat JAR
- automate GitHub releases
- publish a JBang catalog
- install with one command

No cloning. No Maven required.

Full tutorial:
https://www.the-main-thread.com/p/ship-java-cli-jreleaser-jbang-github-release

#Java #JReleaser #JBang #Maven #OpenSource

How do you enforce temporal data integrity?

With SQL Assertions in Oracle AI Database, we can now implement constraints such as:

✅ Non-overlapping validity periods
✅ Temporal referential integrity

Here's a practical example using an extended DEPT-EMP model.

https://www.salvis.com/blog/2026/03/09/using-sql-assertions-to-enforce-temporal-data-integrity/

Using SQL Assertions to Enforce Temporal Data Integrity

Introduction More than twelve years ago, I described the multi-temporal features of Oracle Database in this blog post. In the conclusion, I wrote that I missed a temporal DML API, temporal integrity constraints, temporal joins, and temporal aggregations. These features are still missing today. However, in the latest version of Oracle AI […]

Philipp Salvisberg's Blog

Hierarchies should be trees and not loops.

Learn how SQL Assertions in Oracle AI Database 23.26.1 can help prevent cycles in hierarchical data.

https://www.salvis.com/blog/2026/02/23/enforcing-acyclic-hierarchies-with-sql-assertions/

Enforcing Acyclic Hierarchies With SQL Assertions

Introduction Referential integrity constraints have been available since version 7 of the Oracle Database. While these constraints ensure that referenced rows exist, they cannot express more complex integrity rules that span multiple rows or tables. Check constraints are similarly limited, as they can only validate conditions on the columns of a single […]

Philipp Salvisberg's Blog

I see the dbLinter rules as a large buffet. You choose what you like and what is healthy. But not too much at once. In any case, some rules should be enforced in every project. Do you agree with my top 14?

https://www.salvis.com/blog/2026/01/02/fighting-bad-pl-sql-sql-with-vs-code/

Fighting Bad PL/SQL & SQL with VS Code

The success of a project or product depends largely on the quality of the code. But how can I improve security, maintainability or performance? More importantly, how can I prevent code with quality defects from entering production? In addition to testing, code analysis plays a central role. These days, code can be […]

Philipp Salvisberg's Blog

Closed a long-running action item from August 2023.

The “Coming Soon” page on the Grisselbav website is gone. Replaced with real content.

Meet the Grisselbav team virtually at https://www.grisselbav.com.

Happy New Year!

Database Code Quality & Engineering Practices | Grisselbav

We help teams establish reliable and repeatable engineering practices around their databases, without unnecessary complexity.

Grisselbav
Would you like dbLinter to include a formatter? The more 'thumbs up' we get for the GitHub issue (https://github.com/Grisselbav/dbLinter/issues/45), the sooner it will happen.
New Rule: Always format database code consistently · Issue #45 · Grisselbav/dbLinter

The Problem ATM code style rules are not covered in the rule set of dbLinter. See also No Code Style. This is sad, since well-formatted code is easier to read and consistently formatted code is eas...

GitHub

Is SYSDATE Deterministic? #JoelKallmanDay

No, SYSDATE is not deterministic. However, it behaves very similarly to a deterministic function within an Oracle Database SQL statement.

https://www.salvis.com/blog/2025/10/15/is-sysdate-deterministic-joelkallmanday

Is SYSDATE Deterministic? #JoelKallmanDay

TL;DR No, SYSDATE is not deterministic. However, it behaves very similarly to a deterministic function within an Oracle Database SQL statement. Background On a customer site, we used faketime on the OS to change the date and time for testing purposes. As long as you only travel forward in time, the Oracle […]

Philipp Salvisberg's Blog

#dbLinter rules are easier to implement than others.

You can try out dbLinter for VS Code, Cursor, Windsurf or Theia IDE. Watch the video by @phartenfeller on https://www.youtube.com/watch?v=V-ePBfUFhhk to get started.

New checks are constantly being added—no client update required.

Do your outer join queries produce more rows than expected? In this blog post, I show a strange result when using filter predicates in the join clause.

dbLinter can help you sort your join and filter criteria and spot issues like this.

https://www.salvis.com/blog/2025/07/12/outer-joining-with-ansi-sql-89-and-sql-92/

Outer Joining With ANSI SQL-89 and SQL-92

Introduction I recently implemented a quick fix for the rule G-3130 to transform queries to ANSI SQL-92 syntax. One of the challenges was to handle Oracle’s outer-join syntax (+). In ANSI SQL-89, join and filter criteria are part of the WHERE clause. It’s not easy to distinguish them. In this blog post, […]

Philipp Salvisberg's Blog

Want to use Oracle SQL Developer in VSCodium, Cursor, Windsurf or Theia?

In this blog post, I explain how to do it.

https://www.salvis.com/blog/2025/07/05/installing-sql-developer-in-ides-implementing-the-vs-code-extension-api/

Installing SQL Developer in IDEs Implementing the VS Code Extension API

Introduction The Oracle SQL Developer team is working on bringing the essential functionality built over the last 20 years in the classic SQL Developer IDE—a JDeveloper extension running as a standalone application—to the modern VS Code IDE. The integration with the VS Code ecosystem greatly enhances the developer experience. Is it time […]

Philipp Salvisberg's Blog