Tag: Redgate

  • Prompt EAP AI Experiments: Creating a History Table

    SQL Prompt has an EAP using an AI model to help write code. I’ve been lightly experimenting with it, since I think AI is an interesting tech and it’s going to change our jobs. Maybe for the better, maybe for the worse, but I want to know if this will help me get work done sooner.

    This post looks at one experiment.

    This is part of a series of experiments with AI systems.

    Building a New Table

    I’ve written a lot of SQL code in my career. I know how to structure things and I can often whip something up quickly in response to requests from users or customers. Recently I was trying to mock up a change for a scenario and I decided to use the SQL Prompt AI beta.

    In this case, I wanted a create a history table, similar to a temporal table. I started writing some code, but decided to use the AI to see if things were easier. I tried two experiments here, one using temporal tables, one using just normal T-SQL. Here’s what happened.

    Create a Temporal Table

    As I started documenting this, I decided to ask for a temporal table. You can see my basic code I sketched, but stopped before I created the table. Then I asked SQL Prompt to create the temporal able.

    2024-01-02 14_30_35-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    Here’s what I got:

    2024-01-02 14_32_42-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    The actual code is:

    /* Assuming the ArticlePayment table schema is unaltered before the creation of the history table */
    

    /* Step 1: Add period columns to the original table */
    ALTER TABLE dbo.ArticlePayment
    ADD
       StartDate datetime2(2) GENERATED ALWAYS AS ROW START
    , EndDate datetime2(2) GENERATED ALWAYS AS ROW END
    , PERIOD FOR SYSTEM_TIME(StartDate, EndDate);

    /* Step 2: Change the original table to be a system-versioned temporal table. This will create a new history table with a similar structure as the original table. */
    ALTER TABLE dbo.ArticlePayment SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.ArticlePayment_History));

    That’s pretty good. I don’t usually remember what to do and often end up scanning an article like this one. An AI that provides this code might be a nice time saver, especially if I needed to do a few tables.

    Building an Audit Copy

    The way I’ve often tracked history in the past is essentially copying a table and adding some date columns.

    2024-01-02 14_37_03-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    This is helpful and quick. It gets the datatypes and names, and replicates what’s in the original dbo.ArticlePayment table.

    2024-01-02 14_37_37-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    I want to add nullability, so I asked above. You can see the results below.

    2024-01-02 14_37_51-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    One more prompt:

    2024-01-02 14_40_20-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    The result includes a new column with a default, which I like.

    2024-01-02 14_40_43-SQLQuery2.sql - ARISTOTLE.dlm_1_dev (ARISTOTLE_Steve (64))_ - Microsoft SQL Serv

    I can click the check in the upper left of the Prompt dialog to get this code accepted in my query window. From there, I can run this and then check the code into my VCS with Flyway Winking smile

    Comparison with ADS

    In many cases, I struggle to use an AI well. The public ones don’t see my schema, so if I were to prompt this in Copilot or some equivalent, I’d have to include my schema. If I don’t, I get something like this:

    2024-01-02 14_43_10-● SQLQuery_1 - SQL 2019 sandbox - Azure Data Studio

    If I include the schema (annoying, pasted from SSMS scripting and then commented out and edited, I get something that works, but I get a line at a time and have to accept each line.

    2024-01-02 14_45_10-● SQLQuery_1 - SQL 2019 sandbox - Azure Data Studio

    Thoughts on the Prompt EAP AI

    The EAP AI version of SQL Prompt is reading my schema, as SQL Prompt does, and then running my prompt through an AI LLM with the schema to decide what I mean. In this case, it knows temporal tables are system versioned ones. It produces good code there. Really, this has done the search engine lookup of how to convert a table to temporal, copied the code, and then edited it for my situation.

    If I ignore the temporal aspect and ask for a history table, it creates what I’d do, which is a copy of the table. If I need this altered, it does a good job if doing the edits. Using a little English here, instead of manually editing, actually worked pretty efficiently for me. I’d know what prompts to use now, and I can go back in my prompts copy them, and alter them for other tables.

    Even better, I asked: “create history tables for all article tables”

    I got the code below, which is pretty cool. This is a subset of related tables to articles, not all the tables in my database. Comments from Prompt at the top and then the code.

    /*  

                These scripts will create new tables named 'ArticlePaymentHistory', 'ArticlesHistory', 'ArticleAuthorHistory', 'RatingsHistory', 'UserRatingHistory' which are copies of 'ArticlePayment', 'Articles', 'ArticleAuthor', 'Ratings', 'UserRating'.

                It assume that you want exactly the same structure as the respective tables including all the columns and their types.

                The difference is that all columns in these history tables will NOT BE NULLABLE with an additional column 'ModifiedDate' that defaults to the current date and time.

                It does not copy the data from the original tables. If you need that too then make sure first none of your records from these tables have null

                records for any of the columns because now we have made all columns as 'NOT NULL' in the history tables.

            */

    CREATE TABLE dbo.ArticlePaymentHistory
    ( ArticlePaymentKey  int       NOT NULL
    , ArticleID          int       NOT NULL
    , ContactID          int       NOT NULL
    , PublishDate        date      NOT NULL
    , PaymentDate        date      NOT NULL
    , AuthorPaid         bit       NOT NULL
    , ArticlePaymentRate numeric   NOT NULL
    , ModifiedDate       datetime2 NOT NULL DEFAULT GETDATE ());
    CREATE TABLE dbo.ArticlesHistory
    ( ArticlesID          int       NOT NULL
    , AuthorID            int       NOT NULL
    , Title               char      NOT NULL
    , Description         varchar   NOT NULL
    , Article             varchar   NOT NULL
    , PublishDate         datetime  NOT NULL
    , ModifiedDate        datetime  NOT NULL
    , URL                 char      NOT NULL
    , Comments            int       NOT NULL
    , ReadingTimeEstimate time
    , CreatedDate         datetime2 NOT NULL
    , ModifiedBy          nvarchar  NOT NULL
    , HistoryModifiedDate datetime2 NOT NULL DEFAULT GETDATE ());
    CREATE TABLE dbo.ArticleAuthorHistory
    ( ArticleAuthorKey int       NOT NULL
    , ArticleID        int       NOT NULL
    , ContactID        int       NOT NULL
    , AuthorOrder      tinyint   NOT NULL
    , ModifiedDate     datetime2 NOT NULL DEFAULT GETDATE ());
    CREATE TABLE dbo.RatingsHistory
    ( RatingKey    int       NOT NULL
    , ArticlesID   int       NOT NULL
    , RatingDate   datetime2
    , Rating       tinyint   NOT NULL
    , UserKey      int       NOT NULL
    , ModifiedDate datetime2 NOT NULL DEFAULT GETDATE ());
    CREATE TABLE dbo.UserRatingHistory
    ( UserRatingKey int       NOT NULL
    , UserID        int       NOT NULL
    , ArticleID     int       NOT NULL
    , Rating        numeric   NOT NULL
    , ModifiedDate  datetime2 NOT NULL DEFAULT GETDATE ());

  • Friday Flyway Tips–Linking Commits to an Azure DevOps Work Item

    Recently I was doing a demo and a customer asked how I had linked my commit in Azure DevOps to the work item that existed. It’s easy, and tldr; it’s with the commit comment. This post shows how that works.

    I’ve been working with Flyway Desktop for work more and more as we transition from older SSMS plugins to the standalone tool. This series looks at some tips I’ve gotten along the way.

    Creating a Work Item

    In Azure DevOps, there is a board menu. Under here, one of the subitems is Work Items. You can see these below:

    2023-12-13 17_52_28-Work items - Boards

    I tend to work from the “Boards” item, which looks like this:

    2023-12-13 17_52_22-Westwind Team Features Board - Boards

    Let’s assume we have a new item, so I’ll click the “New Item” at the top of the left column. This gives me an edit box, which I’ll type in a name.

    2023-12-13 17_54_25-Westwind Team Features Board - Boards

    When I hit enter, this gives me a new work item, which you see below, as 250 create products entitty.

    2023-12-13 17_55_19-Westwind Team Features Board - Boards

    Since I don’t want to leave a spelling error, I’ll edit the title to look better.  Now I have a work item.

    Linking A Commit in FWD

    In SSMS, I’ll create the products table. Once I do this, I’ll go to Flyway Desktop and refresh the schema model. When I do this, I see my change. I’ll select this and save to the file system.

    2023-12-13 18_01_48-Flyway Desktop

    Once this is done, I’ll go to the Version Control tab, and I again see my file changed. Here my file is selected, and I’ll enter a commit message, but I’ll include the work item number after a #. This creates a link.

    2023-12-13 18_02_45-Flyway Desktop

    I now click commit and push. In Azure DevOps, in the Repos –> Commit item, I see my commit.

    2023-12-13 18_04_15-Commit 1421f994_ #250 create products table - Repos
    Note the details item under my cursor. If I click that, I see commit details and near the bottom, a link to the work item.

    2023-12-13 18_04_21-Commit 1421f994_ #250 create products table - Repos

    If I click through to the work item, or I access the work item from Boards, I will see my commit linked on the far right of the work item.

    2023-12-13 18_04_32-Westwind Team Features Board - Boards

    This is very handy to have your actual code linked to the work that it relates to. If I have PRs or multiple commits, as long as you use the #nnn, where nnn is the work item, you’ll have everything linked together.

    This is less a Flyway Desktop feature than an Azure DevOps one, but you can access this from Flyway Desktop by writing good commit messages with work item numbers.

    Try Flyway Desktop out today. If you haven’t worked with Flyway Desktop, download it today. There is a free version that organizes migrations and paid versions with many more features.

    Video Walkthrough

    I made a quick video showing this as well. You can watch it below, or check out all the Flyway videos I’ve added:

     

  • Friday Flyway Tips–Above Target Migrations

    Recently I was working with Flyway Desktop (FWD) and practicing deploying certain migrations and not others. I don’t recommend this, but a customer was doing this and I wanted to reproduce some things they were trying to help them.

    In doing this I discovered a bunch of scripts marked as “Above Target” in the GUI, but not in the database. I learned a few things from our support team.

    I’ve been working with Flyway Desktop for work more and more as we transition from older SSMS plugins to the standalone tool. This series looks at some tips I’ve gotten along the way.

    Setting a Target

    I’ve got a FWD project here, and you can see the migrations below. In this case, I’ve selected a target of my QA machine and we can see that I have migrations applied up to 3.1 and there are pending migrations from 4-8 (ignore the undo).

    2023-12-05 14_07_37-Flyway Desktop

    Now, I want to migrate QA, but only to version 5. When I do this, from “Advanced Settings” on the right, I’ll see the target is listed as a parameter, and if I’ve highlighted the parameter on in the script.

    2023-12-05 14_10_13-Flyway Desktop

    I’ll run migrate, which works.

    2023-12-05 14_12_58-Flyway Desktop

    When I close this, I now see a different view. I see success next to migrations 4 and 5, but I also now see “above target” listed for the other migrations.

    2023-12-05 14_13_14-Flyway Desktop

    That’s not great, for this reason. If I check the “only show pending migrations”, I lose all my migrations. In large, complex projects, this isn’t good.

    2023-12-05 14_14_55-Flyway Desktop

    Getting Pending Migrations Back

    The easy solution to this is to remove the target. If I click the “x” on the target parameters…

    2023-12-05 14_15_50-Flyway Desktop

    And then click Refresh at the top, I now see my migrations as pending.

    2023-12-05 14_16_00-Flyway Desktop

    Seems obvious, but I’d forgotten about the target as I was focused on testing the code I’d released and then wanted to release other code. Peter in support educated me on what I was missing.

    Try it out today. If you haven’t worked with Flyway Desktop, download it today. There is a free version that organizes migrations and paid versions with many more features.

    Video Walkthrough

    I made a quick video showing this as well. You can watch it below, or check out all the Flyway videos I’ve added:

     

  • Creating a Scripts Folder in SQL Compare

    While I was at a conference recently, someone asked me about the Scripts Folder feature in SQL Compare and how to set that up. This post just looks at how to get SQL Compare to set up a Scripts folder on a machine.

    This is a part of a series of posts on SQL Compare on my blog. You can read other posts I’ve written by clicking the link.

    Getting Started

    I’ve got a D: drive on my machine that looks like this.

    2023-11-20 14_34_40-SanDisk500 (D_)

    I’m going to create a folder, called “Compare Script Folders”, which you can see is empty. This is where I’ll store the scripts for various databases.

    2023-11-20 14_35_29-Compare Script Folders

    I also have a couple databases I use to test things on a local instance. You can see below my “compare1” database has a few things in it.

    2023-11-20 14_49_17-googlemaps.sql - ARISTOTLE_SQL2022.way0utwest_dev (ARISTOTLE_Steve (53))_ - Micr

    Now, I want to get a text copy of my schema from SQL Compare that I can use to check for changes, so let’s do that.

    Creating a Scripts Folder

    In order to create a scripts folder, I need to run SQL Compare. Once I do that, I see a screen like that shown below.

    2023-11-20 14_51_31-SQL Compare

    By default, SQL Compare looks to compare two databases. However, I can change the source. If I click the drop down next to Source, I see all of the options I have available. One of these is Scripts folder, which I’ll select.

    2023-11-20 14_51_41-(local)_SQL2017.SimpleTalk_1_Dev v localhost.SimpleTalk_1_Dev.scp

    Once I do this, my dialog changes. Now, I have the ability to compare a Scripts folder to a database. How do I get the Scripts folder? I click the Create link shown below.

    2023-11-20 14_51_49-(local)_SQL2017.SimpleTalk_1_Dev v localhost.SimpleTalk_1_Dev.scp_

    I missed this a few times, so that’s part of why I wrote this post. Once I click that, I get a new dialog. This is the one that let’s me choose the way I want to create the folder.

    2023-11-20 14_52_30-Create new scripts folder

    Just like the comparison, I have a number of choices for the source. I can use various items, but in my case, I’ll choose database.

    2023-11-20 14_52_02-(local)_SQL2017.SimpleTalk_1_Dev v localhost.SimpleTalk_1_Dev.scp_

    Once I do this, I enter the credentials to access the database. Note that I’ve clicked “Trust”, which is required for all modern versions of SQL Server. I have also selected the new folder I created.

    2023-11-20 14_52_30-Create new scripts folder

    Once I click Create, the engine will start to script out my database into separate files. This is the same process used when running a comparison, but in this case the results are just output to files rather than held in memory to compare with another set of objects.

    2023-11-20 14_52_38-Creating scripts folder - Completed

    Once the comparison completes, I see a new folder created below the folder that was in my dialog.

    2023-11-20 14_52_54-Compare Script Folders

    Inside this folder are all my objects, separated into different folders, which is the SQL Compare structure. This is the same structure used in SQL Source Control and Flyway.

    2023-11-20 14_53_09-Tables

    Now I can use this as the basis for a source or target against another source or target in SQL Compare.

    If you want to do this from the menu, there’s also an item in the File menu to get the Create Scripts folder dialog.

    2023-11-20 15_04_12-SQL Compare

    SQL Compare is a fantastic product for simplifying work and it does so much more than this. Give it a try if you own it or download an evaluation today.