3

データベース内のすべてのテーブルに、新しい行を計算する必要がある列がありますが、保持する必要がある古い値があります。更新後のトリガーを使用する実用的なソリューションがありますが、それについて何かがうまくいきません。特に、すべてのテーブルにそのようなトリガーを設定するというアイデア。私が単に見落としている他のアイデアがあることを願っています。

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')
4

1 に答える 1

0

コード列の要件が である場合、たとえば、現在の値をすべてそのままUNIQUEにして、既定値を に変更してみませんか?NEWID()

必要なことを行う別の方法は、値を取る別の列を作成することです

ISNULL(code, <formula based on id and origin)

このように、既存のレコードの場合、その値はコードと一致し、コードがおそらく null である新しい値の場合は、新しい数式と一致します。

いずれにせよ、不快なトリガー ソリューションを避ける必要があります、私は同意します。

最後になりましたが、代わりにHASHBYTESを使用しますfn_varbintohexstr

于 2012-11-20T09:20:06.307 に答える