en-US/about_Rivet.help.txt

TOPIC
    about_Rivet
 
SHORT DESCRIPTION
    Rivet is a database migration/change management/versioning tool inspired by Ruby
    on Rails' Migrations. You write PowerShell migration scripts that describe the
    changes you want to make to a SQL Server database, e.g. add a table, add a
    column, drop an index, etc. Rivet applies those scripts to a database, bringing
    its schema up-to-date.
 
    To get started, download Rivet from the PowerShell gallery:
 
        > Save-Module -Name 'Rivet' -Path '.'
 
    This will save Rivet into a `Rivet` directory in your current directory. (If
    you're running PowerShell 4, you'll need to download and install [PowerShell
    Package Management Modules Preview](https://www.microsoft.com/en-us/download/details.aspx?id=51451).)
 
    You can also [download a ZIP file from the Rivet project's GitHub page](https://github.com/webmd-health-services/Rivet/releases). Unzip the file, and
    drag the `Rivet` directory where you'd like it.
 
    Next, you'll need to create a `rivet.json` file that contains a connection
    string to your database and the path where you want to keep your migration
    scripts. The simplest configuration file looks like this:
 
        {
            SqlServerName: '.\Rivet',
            DatabasesRoot: 'Databases'
        }
 
    With this configuration file, Rivet will connect to the SQL Server at `.\Rivet`
    and will look for migration scripts in `Databases\DATABASE_NAME\Migrations`.
 
    Now you can create your first migration. Run:
 
        > .\Rivet\rivet.ps1 -New -Database DATABASE_NAME -Name 'MyFirstMigration'
 
    Rivet will create a migration at
    `Databases\DATABASE_NAME\Migrations\20170625132040_MyFirstMigration.ps1`. The
    migration's filename has two parts: an ID (e.g. `20170625132040` followed by the
    migration's name. Rivet uses the ID to track what migrations have been applied
    to a database.
 
    Open the migration in your favorite PowerShell text editor. We recommend the
    PowerShell ISE, because of its intellisense and debugging capabilities. (To get
    Intellisense as you type, import Rivet first: `Import-Module '.\Rivet'`.)
 
    You'll see two functions: `Push-Migration` and `Pop-Migration`. In the
    `Push-Migration` function, you'll add Rivet operations that modify your
    database. In the `Pop-Migration` function, you'll add operations that
    reverse/rollback the changes made in `Push-Migration`.
 
    Let's create a table:
 
        function Push-Migration
        {
            Add-Table -Name 'MyFirstTable' -Column {
                int 'id' -Identity
            }
        }
 
        function Pop-Migration
        {
            Remove-Table -Name 'MyFirstTable'
        }
 
    To apply your migration to your database, run `rivet.ps1` with its `-Push`
    switch:
 
        > .\Rivet\rivet.ps1 -Push
 
    Look in your database and it will contain the `MyFirstTable` table. By default,
    pushing migrations pushes them to *all* your databases. If you only want to push
    to a single or specific databases, use Rivet's `Database` parameter:
 
        > .\Rivet\rivet.ps1 -Push -Database 'DATABASE_NAME'
 
    To reverse/rolllback your migration run `rivet.ps1` with the `Pop` switch:
 
        > .\Rivet\rivet.ps1 -Pop
 
    This will pop the newest migration in each database's `Migrations` directory.
    (Use the `Database` parameter to pop the newest migration from specific
    databases.) Look in your database, and the `MyFirstTable` database is gone.
 
    Next, let's add another column to our table:
 
        function Push-Migration
        {
            Add-Table -Name 'MyFirstTable' -Column {
                int 'id' -Identity
                nvarchar 'name' 50 -NotNull
            }
        }
 
    You didn't have to modify the `Pop-Migration` function because it removes the
    table, so you don't need to remove each column. As you work on your migration,
    you'll be changing your `Push-Migration` function to get it just right. You'll
    have to do a lot of pushing and popping. Rivet has a special `Redo` switch that
    does a pop followed by a push:
 
        > .\Rivet\rivet.ps1 -Redo
 
    After you run this command, look in your database and you'll see that the
    `MyFirstTable` table now has a `name` column.
 
    Once your migration is done, commit it to your source control repository. Once
    you make your migration available to others, ***it is immutable and should never
    be changed***. Rivet applies migration scripts as an entire unit. It uses each
    migration's ID to determine if that migration has been applied to a database. If
    it has been applied, Rivet skips it and moves on to the next migration. So, if
    you modify a migration after it's public, that change will never get applied
    anywhere. If you need to change a public migration, create a new migration that
    makes the changes you need.
 
    Rivet wraps all pushes and pops in a transaction. If any part of a migration
    fails, the entire transaction is rolled back. Your database will never be left
    in a state where part of a migration is applied.
 
    To see a full list of operations, run this command:
 
        > Get-Command -Module 'Rivet'
 
    Or, [visit the Documentation page at the https://get-rivet.org website](http://get-rivet.org/documentation.html).
 
    See the `about_Rivet_Configuration` topic for details on configuring Rivet in
    the `rivet.json` file.
 
    The `about_Rivet_Plugins` topic explains how to write your own Rivet operations.
 
SEE ALSO
    about_Rivet_Configuration
    about_Rivet_Intellisense
    about_Rivet_Migrations
    about_Rivet_Plugins