From c824d969f48d6283d3bc7a1ab39ff650defa42ca Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Wed, 5 Nov 2025 13:40:24 -0800 Subject: [PATCH 1/8] Added function to create postgres database with owner --- .../NoPublicApiChanges.Run.approved.cs | 5 +- src/dbup-postgresql/PostgresqlExtensions.cs | 104 +++++++++++++----- 2 files changed, 82 insertions(+), 27 deletions(-) diff --git a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs index d7c8f73..f350ad2 100644 --- a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs +++ b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs @@ -1,4 +1,6 @@ -[assembly: System.CLSCompliantAttribute(false)] +using DbUp.Postgresql; + +[assembly: System.CLSCompliantAttribute(false)] [assembly: System.Runtime.InteropServices.ComVisibleAttribute(false)] [assembly: System.Runtime.InteropServices.GuidAttribute("5ddc04cc-0bd3-421e-9ae4-9fd0e4f4ef04")] @@ -16,6 +18,7 @@ public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatab public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } + public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions, string owner) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index 42dbcaa..fee5886 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -16,7 +16,7 @@ /// public static class PostgresqlExtensions { - private static readonly string pattern= @"(?i)Search\s?Path=([^;]+)"; + private static readonly string pattern = @"(?i)Search\s?Path=([^;]+)"; /// /// Creates an upgrader for PostgreSQL databases. /// @@ -165,21 +165,55 @@ public static void PostgresqlDatabase(this SupportedDatabasesForEnsureDatabase s PostgresqlDatabase(supported, connectionString, logger, new PostgresqlConnectionOptions()); } + /// + /// Ensures that the database specified in the connection string exists. + /// + /// Fluent helper type. + /// The connection string. + /// The used to record actions. + /// Certificate for securing connection. + /// public static void PostgresqlDatabase(this SupportedDatabasesForEnsureDatabase supported, string connectionString, IUpgradeLog logger, X509Certificate2 certificate) { var options = new PostgresqlConnectionOptions - { + { ClientCertificate = certificate }; PostgresqlDatabase(supported, connectionString, logger, options); } + /// + /// Ensures that the database specified in the connection string exists. + /// + /// Fluent helper type. + /// The connection string. + /// The used to record actions. + /// Connection SSL to customize SSL behaviour public static void PostgresqlDatabase( - this SupportedDatabasesForEnsureDatabase supported, - string connectionString, - IUpgradeLog logger, + this SupportedDatabasesForEnsureDatabase supported, + string connectionString, + IUpgradeLog logger, PostgresqlConnectionOptions connectionOptions ) + { + PostgresqlDatabase(supported, connectionString, logger, connectionOptions, null); + } + + /// + /// Ensures that the database specified in the connection string exists, assigning an owner at creation time. + /// + /// Fluent helper type. + /// The connection string. + /// The used to record actions. + /// Connection SSL to customize SSL behaviour + /// Role to own the new database during creation (adds 'WITH OWNER = "role"'). + public static void PostgresqlDatabase( + this SupportedDatabasesForEnsureDatabase supported, + string connectionString, + IUpgradeLog logger, + PostgresqlConnectionOptions connectionOptions, + string owner + ) { if (supported == null) throw new ArgumentNullException("supported"); @@ -191,7 +225,7 @@ PostgresqlConnectionOptions connectionOptions if (logger == null) throw new ArgumentNullException("logger"); var masterConnectionStringBuilder = new NpgsqlConnectionStringBuilder(connectionString); - + var databaseName = masterConnectionStringBuilder.Database; if (string.IsNullOrEmpty(databaseName) || databaseName.Trim() == string.Empty) @@ -199,6 +233,8 @@ PostgresqlConnectionOptions connectionOptions throw new InvalidOperationException("The connection string does not specify a database name."); } + owner = string.IsNullOrWhiteSpace(owner) ? masterConnectionStringBuilder.Username : owner; + masterConnectionStringBuilder.Database = connectionOptions.MasterDatabaseName; var logMasterConnectionStringBuilder = new NpgsqlConnectionStringBuilder(masterConnectionStringBuilder.ConnectionString); @@ -218,9 +254,9 @@ PostgresqlConnectionOptions connectionOptions // check to see if the database already exists.. using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { var results = Convert.ToInt32(command.ExecuteScalar()); @@ -231,13 +267,29 @@ PostgresqlConnectionOptions connectionOptions } } - sqlCommandText = $"create database \"{databaseName}\";"; + sqlCommandText = $"select 1 from pg_roles where rolname = \'{owner}\' limit 1;"; + // check to see if the owner exists.. + using (var command = new NpgsqlCommand(sqlCommandText, connection) + { + CommandType = CommandType.Text + }) + { + var results = Convert.ToInt32(command.ExecuteScalar()); + + // if the owner role does not exist, we throw an exception. + if (results == 0) + { + throw new InvalidOperationException($"PostgreSQL role '{owner}' does not exist."); + } + } + + sqlCommandText = $"create database \"{databaseName}\" with owner = \"{owner}\";"; // Create the database... using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { command.ExecuteNonQuery(); } @@ -319,7 +371,7 @@ PostgresqlConnectionOptions connectionOptions var masterConnectionStringBuilder = new NpgsqlConnectionStringBuilder(connectionString); - var databaseName = masterConnectionStringBuilder.Database; + var databaseName = masterConnectionStringBuilder.Database; if (string.IsNullOrEmpty(databaseName) || databaseName.Trim() == string.Empty) { @@ -351,9 +403,9 @@ PostgresqlConnectionOptions connectionOptions // check to see if the database already exists.. using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { var results = Convert.ToInt32(command.ExecuteScalar()); @@ -368,9 +420,9 @@ PostgresqlConnectionOptions connectionOptions // prevent new connections to the database sqlCommandText = $"alter database \"{databaseName}\" with ALLOW_CONNECTIONS false;"; using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { command.ExecuteNonQuery(); } @@ -380,9 +432,9 @@ PostgresqlConnectionOptions connectionOptions // terminate all existing connections to the database sqlCommandText = $"select pg_terminate_backend(pg_stat_activity.pid) from pg_stat_activity where pg_stat_activity.datname = \'{databaseName}\';"; using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { command.ExecuteNonQuery(); } @@ -393,9 +445,9 @@ PostgresqlConnectionOptions connectionOptions // drop the database using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) + { + CommandType = CommandType.Text + }) { command.ExecuteNonQuery(); } From a686ef31f2ccd49e9b819ab0b94a47512469360a Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Wed, 5 Nov 2025 13:45:49 -0800 Subject: [PATCH 2/8] Remonved using statement in NoPublicApiChanges.Run.approved.cs --- src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs index f350ad2..0c67f90 100644 --- a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs +++ b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs @@ -1,6 +1,4 @@ -using DbUp.Postgresql; - -[assembly: System.CLSCompliantAttribute(false)] +[assembly: System.CLSCompliantAttribute(false)] [assembly: System.Runtime.InteropServices.ComVisibleAttribute(false)] [assembly: System.Runtime.InteropServices.GuidAttribute("5ddc04cc-0bd3-421e-9ae4-9fd0e4f4ef04")] From 3375b7e3d28ba351c8f78cffd769878c6c279b80 Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Wed, 5 Nov 2025 14:56:50 -0800 Subject: [PATCH 3/8] Fixed test --- src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs index 0c67f90..ede6509 100644 --- a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs +++ b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs @@ -16,7 +16,6 @@ public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatab public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } - public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions, string owner) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } @@ -25,6 +24,7 @@ public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatab public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } + public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions, string owner) { } } namespace DbUp.Postgresql { From 8a002b259f437ea62c07a889ca360423e20e259d Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Thu, 6 Nov 2025 14:34:22 +1000 Subject: [PATCH 4/8] Apply suggestion from @droyad --- src/dbup-postgresql/PostgresqlExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index e09d06d..750570d 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -172,7 +172,6 @@ public static void PostgresqlDatabase(this SupportedDatabasesForEnsureDatabase s /// The connection string. /// The used to record actions. /// Certificate for securing connection. - /// public static void PostgresqlDatabase(this SupportedDatabasesForEnsureDatabase supported, string connectionString, IUpgradeLog logger, X509Certificate2 certificate) { var options = new PostgresqlConnectionOptions From daea1704d44e2f9b248bd43d8221c8bade9ca719 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Thu, 6 Nov 2025 14:41:39 +1000 Subject: [PATCH 5/8] Update src/dbup-postgresql/PostgresqlExtensions.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/dbup-postgresql/PostgresqlExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index 750570d..17ddc62 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -204,7 +204,7 @@ PostgresqlConnectionOptions connectionOptions /// Fluent helper type. /// The connection string. /// The used to record actions. - /// Connection SSL to customize SSL behaviour + /// Connection options to set SSL parameters /// Role to own the new database during creation (adds 'WITH OWNER = "role"'). public static void PostgresqlDatabase( this SupportedDatabasesForEnsureDatabase supported, From a9f9ae33ba4d5ffe477916f4f8617a679cd5f74b Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Thu, 6 Nov 2025 11:55:05 -0800 Subject: [PATCH 6/8] Addressed PR comments around SQLi and using if/else for creating a database with or without owner --- .../NoPublicApiChanges.Run.approved.cs | 3 + src/dbup-postgresql/PostgresqlExtensions.cs | 68 ++++++++++++------- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs index 0bc5803..5b70f6b 100644 --- a/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs +++ b/src/Tests/ApprovalFiles/NoPublicApiChanges.Run.approved.cs @@ -22,6 +22,9 @@ public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatab public static DbUp.Builder.UpgradeEngineBuilder PostgresqlDatabase(this DbUp.Builder.SupportedDatabases supported, string connectionString, string schema, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } public static DbUp.Builder.UpgradeEngineBuilder PostgresqlDatabase(this DbUp.Builder.SupportedDatabases supported, string connectionString, string schema, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } + public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForDropDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } + public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions) { } + public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { } public static void PostgresqlDatabase(this DbUp.SupportedDatabasesForEnsureDatabase supported, string connectionString, DbUp.Engine.Output.IUpgradeLog logger, DbUp.Postgresql.PostgresqlConnectionOptions connectionOptions, string owner) { } } namespace DbUp.Postgresql diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index 17ddc62..8881b45 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Data; using System.Security.Cryptography.X509Certificates; using System.Text.RegularExpressions; @@ -232,8 +232,6 @@ string owner throw new InvalidOperationException("The connection string does not specify a database name."); } - owner = string.IsNullOrWhiteSpace(owner) ? masterConnectionStringBuilder.Username : owner; - masterConnectionStringBuilder.Database = connectionOptions.MasterDatabaseName; var logMasterConnectionStringBuilder = new NpgsqlConnectionStringBuilder(masterConnectionStringBuilder.ConnectionString); @@ -266,34 +264,56 @@ string owner } } - sqlCommandText = $"select 1 from pg_roles where rolname = \'{owner}\' limit 1;"; - // check to see if the owner exists.. - using (var command = new NpgsqlCommand(sqlCommandText, connection) + if (!string.IsNullOrEmpty(owner)) { - CommandType = CommandType.Text - }) - { - var results = Convert.ToInt32(command.ExecuteScalar()); - - // if the owner role does not exist, we throw an exception. - if (results == 0) + sqlCommandText = "select exists (select 1 from pg_roles where rolname = @owner);"; + // check to see if the owner exists.. + using (var command = new NpgsqlCommand(sqlCommandText, connection) + { + CommandType = CommandType.Text + }) { - throw new InvalidOperationException($"PostgreSQL role '{owner}' does not exist."); + command.Parameters.AddWithValue("@owner", owner); + + var roleExists = (bool) command.ExecuteScalar(); + // if the owner role does not exist, we throw an exception. + if (!roleExists) + { + throw new InvalidOperationException($"PostgreSQL role '{owner}' does not exist."); + } } - } - sqlCommandText = $"create database \"{databaseName}\" with owner = \"{owner}\";"; + using var formattedSql = new NpgsqlCommand("select format('create database %I WITH owner = %I', @databaseName, @owner);", connection); + formattedSql.Parameters.AddWithValue("databaseName", databaseName); + formattedSql.Parameters.AddWithValue("owner", owner); + sqlCommandText = (string)formattedSql.ExecuteScalar(); - // Create the database... - using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) - { - command.ExecuteNonQuery(); + // Create the database.. + using (var command = new NpgsqlCommand(sqlCommandText, connection) + { + CommandType = CommandType.Text, + }) + { + command.ExecuteNonQuery(); + } + + logger.LogInformation(@"Created database {0} with owner {1}", databaseName, owner); } + else + { + sqlCommandText = $"create database \"{databaseName}\";"; + + // Create the database... + using (var command = new NpgsqlCommand(sqlCommandText, connection) + { + CommandType = CommandType.Text + }) + { + command.ExecuteNonQuery(); + } - logger.LogInformation(@"Created database {0}", databaseName); + logger.LogInformation(@"Created database {0}", databaseName); + } } /// From 7e17862db656a5d82b8b00359293dfc12f548094 Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Thu, 6 Nov 2025 13:31:39 -0800 Subject: [PATCH 7/8] Flipped boolean logic around --- src/dbup-postgresql/PostgresqlExtensions.cs | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index 8881b45..0ecaabc 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -264,7 +264,22 @@ string owner } } - if (!string.IsNullOrEmpty(owner)) + if (string.IsNullOrEmpty(owner)) + { + sqlCommandText = $"create database \"{databaseName}\";"; + + // Create the database... + using (var command = new NpgsqlCommand(sqlCommandText, connection) + { + CommandType = CommandType.Text + }) + { + command.ExecuteNonQuery(); + } + + logger.LogInformation(@"Created database {0}", databaseName); + } + else { sqlCommandText = "select exists (select 1 from pg_roles where rolname = @owner);"; // check to see if the owner exists.. @@ -275,7 +290,7 @@ string owner { command.Parameters.AddWithValue("@owner", owner); - var roleExists = (bool) command.ExecuteScalar(); + var roleExists = (bool)command.ExecuteScalar(); // if the owner role does not exist, we throw an exception. if (!roleExists) { @@ -298,21 +313,6 @@ string owner } logger.LogInformation(@"Created database {0} with owner {1}", databaseName, owner); - } - else - { - sqlCommandText = $"create database \"{databaseName}\";"; - - // Create the database... - using (var command = new NpgsqlCommand(sqlCommandText, connection) - { - CommandType = CommandType.Text - }) - { - command.ExecuteNonQuery(); - } - - logger.LogInformation(@"Created database {0}", databaseName); } } From 0a58605a53982962d1f258ad1d031a0bb3d78951 Mon Sep 17 00:00:00 2001 From: Aashik Nagadikeri Harish Date: Thu, 6 Nov 2025 13:32:14 -0800 Subject: [PATCH 8/8] formatting --- src/dbup-postgresql/PostgresqlExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbup-postgresql/PostgresqlExtensions.cs b/src/dbup-postgresql/PostgresqlExtensions.cs index 0ecaabc..a20b10c 100644 --- a/src/dbup-postgresql/PostgresqlExtensions.cs +++ b/src/dbup-postgresql/PostgresqlExtensions.cs @@ -298,7 +298,7 @@ string owner } } - using var formattedSql = new NpgsqlCommand("select format('create database %I WITH owner = %I', @databaseName, @owner);", connection); + using var formattedSql = new NpgsqlCommand("select format('create database %I with owner = %I', @databaseName, @owner);", connection); formattedSql.Parameters.AddWithValue("databaseName", databaseName); formattedSql.Parameters.AddWithValue("owner", owner); sqlCommandText = (string)formattedSql.ExecuteScalar();