SYSTEN
SYSTEM
private void InitSystemSchema() { using (var transaction = Database.CreateSafeTransaction(IsolationLevel.Serializable)) { try { SystemSchema.Setup(transaction); transaction.Commit(); } catch (Exception ex) { throw new InvalidOperationException("Transaction Exception initializing tables.", ex); } } }
public static void CreateAdminUser(this IDatabase database, IQuery context, string adminName, string adminPassword) { try { var user = context.CreateUser(adminName, adminPassword); // This is the admin user so add to the 'secure access' table. context.AddUserToGroup(adminName, SystemGroups.SecureGroup); context.GrantToUserOnSchema(database.Context.DefaultSchema(), user.Name, Privileges.SchemaAll, true); context.GrantToUserOnSchema(SystemSchema.Name, user.Name, Privileges.SchemaRead); context.GrantToUserOnSchema(InformationSchema.SchemaName, user.Name, Privileges.SchemaRead); SystemSchema.GrantToPublic(context); } catch (DatabaseSystemException) { throw; } catch (Exception ex) { throw new DatabaseSystemException("Could not create the database administrator.", ex); } }
/// <summary> /// Creates the database in the context given, granting the administrative /// control to the user identified by the given name and password. /// </summary> /// <param name="adminName">The name of the administrator.</param> /// <param name="adminPassword">The password used to identify the administrator.</param> /// <exception cref="DatabaseSystemException"> /// If the database context is configured to be in read-only model, if it was not possible /// to commit the initial information or if another unhanded error occurred while /// creating the database. /// </exception> /// <exception cref="ArgumentNullException"> /// If either one of <paramref name="adminName"/> or <paramref name="adminPassword"/> /// are <c>null</c> or empty. /// </exception> /// <remarks> /// <para> /// The properties used to create the database are extracted from /// the underlying context (<see cref="DatabaseContext" />). /// </para> /// <para> /// This method does not automatically open the database: to make it accessible /// a call to <see cref="Open" /> is required. /// </para> /// </remarks> /// <seealso cref="IDatabaseContext.Configuration" /> public void Create(string adminName, string adminPassword) { if (Context.ReadOnly()) { throw new DatabaseSystemException("Cannot create database in read-only mode."); } if (String.IsNullOrEmpty(adminName)) { throw new ArgumentNullException("adminName"); } if (String.IsNullOrEmpty(adminPassword)) { throw new ArgumentNullException("adminPassword"); } try { // Create the conglomerate TableComposite.Create(); using (var session = this.CreateInitialSystemSession()) { using (var context = session.CreateQuery()) { try { session.CurrentSchema(SystemSchema.Name); // Create the schema information tables CreateSchemata(context); // The system tables that are present in every conglomerate. SystemSchema.CreateTables(context); SystemGroups.Create(context); context.CreatePublicUser(); // Create the system views InformationSchema.CreateViews(context); InformationSchema.GrantToPublic(context); this.CreateAdminUser(context, adminName, adminPassword); SetCurrentDataVersion(context); // Set all default system procedures. // TODO: SystemSchema.SetupSystemFunctions(session, username); OnDatabaseCreate(context); try { // Close and commit this transaction. session.Commit(); } catch (TransactionException e) { throw new DatabaseSystemException("Could not commit the initial information", e); } } catch (DatabaseSystemException) { throw; } catch (Exception ex) { throw new DatabaseSystemException("An error occurred while creating the database.", ex); } } } // Close the conglomerate. TableComposite.Close(); } catch (DatabaseSystemException) { throw; } catch (Exception e) { throw new DatabaseSystemException("An error occurred while creating the database.", e); } }