データレポジトリで定義を更新すると、自動採番列が振り直されてしまう
こんにちは。2回目の投稿です。
Magic xpa のデータレポジトリにて テーブルに列追加等の変更を行うと、
SQLServer の IDENTITY 値が振り直されてしまう事に気づきました。
たとえば、 プライマリキーでもある●●連番 (例: 1,3,5。2,4のレコードは削除済)が、
テーブル変更後、(1,2,3) になってしまい、
参照テーブル側の ●●連番 列が旧値のままになって整合が崩れてしまいました。
これを避ける(1,3,5のままでいさせる) 事は、Magic側の操作では無理でしょうか?
-
(予想ですが)
旧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 ..でないんかいっ!と言うツッコミ)、
まさしく笑でした。
以上、ご参考まで。 -
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_設定]; -
Magicしかやっていない人はSQL文を書いた事は1度も無いという人も自分の知り合いでは多いです。
今回勉強になりました。ありがとうございます。
▼以下のような事が出来るのも初めて知りました。試しました。
データ退避が簡単に出来て最高です。
SELECT * INTO M_会社_260515_1554 FROM M_会社
他にも知らない事ばかりなのでCopilotへ解説してもらい学びます。
ありがとうございました。 -
ご返信ありがとうございます。
できれば、Magic側も、☑IDENTITY項目の値を保持する とかの特性を追加し、
内部で上記のような処理をしてくれれば有難いのですけどね。。
上記一連のSQLも、ぶっちゃけ、AIとの共同作業で、Pythonのスクリプト実行より出力したものです。
一旦こういう柔軟性を手にすると、私の中のMagic離れ(最近、Hello Magic! だったのですが)が進んでしまっております。。(検閲受けそう) -
つづらさん、
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) -
つづらさん、
失礼しました、下記が正解です。
——(前略)
また、この値はカラムの削除や追加が発生した場合にも同じく SQLServer によって自動リナンバリングされるので、固定的な値としては活用できません。このあたりが要注意です。
——(後略)
あと確かに、つづらさんが書かれているように、「SET IDENTITY_INSERT ON」の指定が特性シート上でできるようであれば、固定値の保持が可能ですね。
ただ、やはり昔のように、「MAGICKEY=Y」が復活してくれるのが、いちばん楽ですね。ひょっとしたらまだ使えるのかもしれませんが、サポートが終了しているということで、検証はしてませんが。。。
-
Tandaさん
リプライ&改訂くださり、ありがとうございます。
今回、個人的な思いで、各テーブル間を「●●連番」同士(のみ)で結合する様に企てております。
その方が、AIによる自然言語検索実装の相性が良さげということもありまして。。
MAGICKEY=Yと言うパラメータ―、初耳でして、ついついこのフォーラムで検索してみました。
サインインしてコメントを残してください。
コメント
10件のコメント