メインコンテンツへスキップ

データレポジトリで定義を更新すると、自動採番列が振り直されてしまう

コメント

10件のコメント

  • nkmt

    (予想ですが)
    旧TBL → 新レイアウトのTBLへコピーする動きになるのではないかと思うので
    Magic上ではお望みの事は無理かもしれないですね。

    ▼最近項目追加はこんなのばかり使ってます。
    ALTER  TABLE  MST得意先
           ADD    同業者FLG    bit    NOT NULL     DEFAULT (0)


  • つづら

    nkmtさん

    ご返信ありがとうございます。

    Magic上でのテーブル変更は、裏で色々うまいこと処理してくれる分有難いのですが、、
    今回はそれが裏目に出てしまっている感じです。

    結局、このまま、INT IDENTITY を採用する、かつ、Magicからテーブル定義を変えるのであれば・・・

    と、以下ひとまず実装(スクリプトよりそういうSQL文を自動生成)してみました。

    テーブル変更前
     退避テーブルを作成

    テーブル変更後
     テーブルのトリガーオフ
      テーブルのデータ削除
       テーブルの自動採番オフ
        退避テーブルから全件INSERT(●●連番はそのままの値で)
       テーブルの自動採番オン
      連番の最大値を取得
      自動採番の値を最大値に変更
     テーブルのトリガーオン

    なお、バックアップを残すを選択し、BCK008のようなテーブルの内容を見たら、
    すでに●●連番の値が自動採番されてしまっていて空き番がなくて
    (単純に、SELECT * INTO BCK008 FROM ..でないんかいっ!と言うツッコミ)、
    まさしく笑でした。


    以上、ご参考まで。

  • nkmt

    INT IDENTITYを使った事がない自分がレスして申し訳ないですが
    自動採番の値を最大値に変更や
    テーブルのトリガーなどそんな機能があるのも知りませんでした。
    ありがとうございました。

  • つづら

    Magicを開発業務に使いだしたのが最近で良く分かってないのですが、
    テーブルの定義変更がGUIで出来る分は、有難いなと思ってます。

    ただ、今は、Magicを使わないWebPGを開発しており、
    Magicではモデルとデータレポジトリの操作しかしていないので、それならば無理やり使わなくてもいいのですが。。


    こんな感じのスクリプトを出力させてます。
    -- ---------------------------------------------------------------------

    -- ① 退避(Magic によるテーブル定義の変更前に実行)
    DROP TABLE IF EXISTS [M_設定_退避];
    SELECT * INTO [M_設定_退避] FROM [M_設定];
    SELECT N'① 退避データ' AS 内容, * FROM [M_設定_退避];

    -- ② 復元(Magic によるテーブル定義の変更後に実行)
    --    ※ 新列が NOT NULL かつ DEFAULT 制約なしの場合のみ、SELECT 側に  デフォルト値 AS [新列名]  を手で追加する

    SELECT N'②-1 定義変更後データ' AS 内容, * FROM [M_設定];
    IF OBJECT_ID(N'[M_設定_退避]', N'U') IS NULL
    BEGIN
        RAISERROR(N'退避テーブル [M_設定_退避] が存在しません。① を先に実行してください。', 16, 1);
    END
    ELSE
    BEGIN
        DECLARE @max int;
        BEGIN TRY
            BEGIN TRANSACTION;
            ALTER TABLE [M_設定] DISABLE TRIGGER ALL;
            DELETE FROM [M_設定];
            SET IDENTITY_INSERT [M_設定] ON;
            INSERT INTO [M_設定]
               ( [設定連番]
                     :
                ,[登録時刻])
         SELECT  [設定連番]
                     :
                ,[登録時刻]
           FROM [M_設定_退避];
            SET IDENTITY_INSERT [M_設定] OFF;
            SELECT @max = ISNULL(MAX([設定連番]), 0) FROM [M_設定];
            DBCC CHECKIDENT ('M_設定', RESEED, @max);
            ALTER TABLE [M_設定] ENABLE TRIGGER ALL;
            DROP TABLE [M_設定_退避];
            COMMIT;
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            SET IDENTITY_INSERT [M_設定] OFF;
            ALTER TABLE [M_設定] ENABLE TRIGGER ALL;
            THROW;
        END CATCH
    END
    SELECT N'②-2 連番復旧後データ' AS 内容, * FROM [M_設定];

  • nkmt

    Magicしかやっていない人はSQL文を書いた事は1度も無いという人も自分の知り合いでは多いです。
    今回勉強になりました。ありがとうございます。

    ▼以下のような事が出来るのも初めて知りました。試しました。
     データ退避が簡単に出来て最高です。
    SELECT * INTO M_会社_260515_1554 FROM M_会社

    他にも知らない事ばかりなのでCopilotへ解説してもらい学びます。
    ありがとうございました。

  • つづら

    ご返信ありがとうございます。
    できれば、Magic側も、☑IDENTITY項目の値を保持する とかの特性を追加し、
    内部で上記のような処理をしてくれれば有難いのですけどね。。

    上記一連のSQLも、ぶっちゃけ、AIとの共同作業で、Pythonのスクリプト実行より出力したものです。
    一旦こういう柔軟性を手にすると、私の中のMagic離れ(最近、Hello Magic! だったのですが)が進んでしまっております。。(検閲受けそう)

     

  • Tanda

    つづらさん、

    INT IDENTITYは、正確にいうとMagicの機能ではなくて、SQL Serverが持つ機能をMagicからコールしているだけのものです。SQL Serverの物理トランザクションをMagicからコールしているのと同じようなイメージですね。

    下記は、私の過去の連載記事からの引用です。よろしければ参考にしてください。

    第35回 SQL Server上にユニークキーを自動生成する方法(2011年1月31日)

    ——(前略)

    また、この値はレコードの削除や追加が発生した場合にも同じく SQLServer によって自動リナンバリングされるので、固定的な値としては活用できません。このあたりが要注意です。

    ——(後略)

  • つづら

    Tanda さん

    リプライ、ありがとうございます。

    細かいですが、厳密には、
    >この値はレコードの削除や追加が発生した場合にも同じく SQLServer によって自動リナンバリングされる
    このケースは、経験上当てはまらないと思われますが、いかがでしょうか。
    (1,2,3のレコードで#2を行削除して次に行追加すると、結果は、1,3,4)

  • Tanda

    つづらさん、

    失礼しました、下記が正解です。

    ——(前略)

    また、この値はカラムの削除や追加が発生した場合にも同じく SQLServer によって自動リナンバリングされるので、固定的な値としては活用できません。このあたりが要注意です。

    ——(後略)

    あと確かに、つづらさんが書かれているように、「SET IDENTITY_INSERT ON」の指定が特性シート上でできるようであれば、固定値の保持が可能ですね。

    ただ、やはり昔のように、「MAGICKEY=Y」が復活してくれるのが、いちばん楽ですね。ひょっとしたらまだ使えるのかもしれませんが、サポートが終了しているということで、検証はしてませんが。。。

  • つづら

    Tandaさん

    リプライ&改訂くださり、ありがとうございます。

    今回、個人的な思いで、各テーブル間を「●●連番」同士(のみ)で結合する様に企てております。
    その方が、AIによる自然言語検索実装の相性が良さげということもありまして。。

    MAGICKEY=Yと言うパラメータ―、初耳でして、ついついこのフォーラムで検索してみました。



サインインしてコメントを残してください。