. Net EF Core + PostgreSQL - Невозможно предоставить разрешения пользователя БД на базу данных с помощью команды «Выполнить» SQL - PullRequest
0 голосов
/ 27 марта 2020

Мне не повезло. 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...