Мне не повезло. Net Entity Framework Core + PostgreSQL для предоставления пользователю базы данных разрешений для вновь созданной базы данных, используя 'ExecuteSQLCommand.
Немного предыстории:
- Система представляет собой мультитенантную SaaS с отдельной базой данных для каждого арендатора
- В процессе регистрации создается новая база данных Posgtre Sql и новый пользователь базы данных
- Затем у меня есть метод, который пытается предоставить новому пользователю разрешение на базу данных; это не работает.
- Я создаю динамический c DBContext и строку подключения
- Команда SQL для предоставления разрешений динамически собирается (известно о SQL риск внедрения, но не ясно, есть ли другой способ сделать это)
- Затем я вызываю метод ExecuteSQLCommand в контексте БД. Метод возвращает -1 (успех), но команды GRANT не выполняются.
Я убедился, что текст команды SQL работает - я устанавливаю точку останова сразу после создания командной строки, скопировал строку непосредственно в PGAdmin и выполнил, что предоставило разрешения, как и ожидалось.
Любая помощь с этим действительно приветствуется
public async Task<bool> GrantDBUserPermissionsToDatabase(AppTenant newTenant)
{
string AdminConnectionString = "";
// ** Code to build connection string removed for brevity
// Find '[DATABASENAME]' placeholder and replace with new database name
AdminConnectionString = AdminConnectionString.Replace("[DATABASENAME]", newTenant.AccountName);
// Create Temporary Kontrol DB Context
KontrolContext myTempKontrolContext = await CreateTempKontrolDbContext(AdminConnectionString, newTenant);
// Build SQL Command
string databaseName = newTenant.AccountName;
string userName = newTenant.AccountName;
string sqlCommand = "SET search_path to \"" + databaseName + "\"; "
+ "GRANT ALL PRIVILEGES ON DATABASE \"" + databaseName + "\" TO \"" + userName + "\"; "
+ "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"" + userName + "\"; "
+ "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"" + userName + "\"; "
+ "GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO \"" + userName + "\"; ";
// Grant new DB User permissions to Database
// *** NOT WORKING...
int result = myTempKontrolContext.Database.ExecuteSqlCommand(sqlCommand);
if (result == -1)
{
return true;
}
return false;
}