データベース内のすべてのテーブルに、新しい行を計算する必要がある列がありますが、保持する必要がある古い値があります。更新後のトリガーを使用する実用的なソリューションがありますが、それについて何かがうまくいきません。特に、すべてのテーブルにそのようなトリガーを設定するというアイデア。私が単に見落としている他のアイデアがあることを願っています。
DEFAULT 列の値でそれを行う方法があれば本当にうれしいのですが、それは不可能のようです。私の知る限り、DEFAULT スカラー関数が行に挿入されている他の値を確認する方法はありません。
これは、現在のソリューションを示すサンプル データベースです。便宜上、SQL Fiddle に配置しました。
ただし、これを再作成するためのコードは次のとおりです (将来何らかの理由で SQL Fiddle にアクセスできなくなった場合に備えて)。
CREATE TABLE tmpTest (
id INT IDENTITY PRIMARY KEY,
origin INT DEFAULT 15,
code VARCHAR(9),
name VARCHAR(100),
UNIQUE (code)
)
GO
CREATE TRIGGER tmpTest_code ON tmpTest
AFTER INSERT AS
UPDATE t SET
t.code = RIGHT(UPPER(master.dbo.fn_varbintohexstr(t.origin)), 2)
+ RIGHT(UPPER(master.dbo.fn_varbintohexstr(t.id)), 7)
FROM tmpTest t
INNER JOIN inserted i ON i.id = t.id
WHERE t.code IS NULL
GO
INSERT INTO tmpTest (name) VALUES ('one')
INSERT INTO tmpTest (name) VALUES ('two')
INSERT INTO tmpTest (name) VALUES ('three')
INSERT INTO tmpTest (name) VALUES ('four')
INSERT INTO tmpTest (name) VALUES ('five')
INSERT INTO tmpTest (name) VALUES ('six')
INSERT INTO tmpTest (name) VALUES ('seven')
INSERT INTO tmpTest (name) VALUES ('eight')
INSERT INTO tmpTest (name) VALUES ('nine')
INSERT INTO tmpTest (name) VALUES ('ten')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000001', 'legacy one')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000002', 'legacy two')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000003', 'legacy three')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000004', 'legacy four')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000005', 'legacy five')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000006', 'legacy six')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000007', 'legacy seven')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000008', 'legacy eight')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '030000009', 'legacy nine')
INSERT INTO tmpTest (origin, code, name) VALUES (3, '03000000A', 'legacy ten')