Gérer les utilisateurs • Créer la base de données • Générer et importer les vues • Gêrer le discriminant ➔ Appliquer les migrations ➔ Point sur les perfs
Application($this->kernel))->run( new ArrayInput(['command' => 'doctrine:database:create']), new NullOutput() ); $this->connection->executeStatement(" CREATE USER {$user->getSqlUserName()} WITH PASSWORD '{$user->getSqlPassword()}'; ");
foreach ($this->tables as $name => $options) { $viewName = "{$name}_{$psqlId}"; $this->connection->executeStatement(" CREATE VIEW {$viewName} AS SELECT * FROM {$name} WHERE owner_id = '{$user->getId()}'; GRANT SELECT, INSERT, UPDATE, DELETE on {$viewName} TO {$username}; "); }
'common']); foreach ($this->manyTables as $name => $options) { $view = "{$name}_{$psqlId}"; $this->connection->executeStatement(" CREATE VIEW {$view} AS SELECT * FROM {$name} WHERE {$options[0]} IN (SELECT id FROM {$options[2]} WHERE owner_id = '{$id}') OR {$options[1]} IN (SELECT id FROM {$options[3]} WHERE owner_id = '{$id}'); GRANT SELECT, INSERT, UPDATE, DELETE on {$view} TO {$username}; "); }
=> $user->getSqlDbName()]); $this->connection->executeStatement(" CREATE EXTENSION IF NOT EXISTS postgres_fdw; CREATE SERVER IF NOT EXISTS common_fdw FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', port '5432', dbname 'common'); CREATE USER MAPPING IF NOT EXISTS FOR common SERVER common_fdw OPTIONS (user 'common'); CREATE USER MAPPING IF NOT EXISTS FOR {$user->getSqlUser()} SERVER common_fdw OPTIONS (user '{$user->getSqlUser()}', password '{$user->getSqlPassword()}'); "); foreach ($this->tables as $name => $options) { $viewName = "{$name}_{$psqlId}"; $this->connection->executeStatement(" IMPORT FOREIGN SCHEMA public LIMIT TO ({$viewName}) FROM SERVER common_fdw INTO public; ALTER TABLE {$viewName} RENAME TO {$name}; "); }
\$override_id\$ BEGIN NEW.owner_id := 'idDeMonUtilisateur'; RETURN NEW; END; \$override_id\$ LANGUAGE plpgsql; CREATE OR REPLACE TRIGGER monSuperTrigger BEFORE INSERT ON "maSuperTable" FOR EACH ROW EXECUTE PROCEDURE override_id();
FROM books ) REFRESH MATERIALIZED VIEW cached_books ; Depuis Postgres 15: MERGE INTO books b USING books_stock_changes s ON s.book_id = b.id WHEN MATCHED UPDATE SET in_stock = s.returned