1つの列を読み取り専用にすることは可能ですか?


25

絶対に変更できない列を持つテーブルを作成することは可能ですが、テーブルの他の列は可能です。

たとえば、CreatedByUser変更しないカラムを想像できます。

このためにSQL Serverに組み込みの機能がありますか、それともトリガーなどを介してのみ可能ですか?


トリガーを実装し、プロシージャを介してステートメントの作成/更新/削除のみを許可する以外に、これを回避する方法はないと思います。
マークS.ラスムッセン


@MartinSmithありがとう、リンク。それが私の質問に対する答えになると思います。それを答えにして、受け入れます。
フィリップM

回答:


19

更新不可能な列に対する組み込みの宣言的サポートはありません(などの特定の事前定義されたケースを除くIDENTITY

このConnectアイテムはそれを要求しましたが、拒否されました。DRIを追加して不変列値を強制する

UPDATEトリガーは、おそらくこれを達成するための最も強力な方法だろう。IF UPDATE(CreatedByUser)エラーをチェックして発生させ、trueの場合はトランザクションをロールバックできます。


:上記のリンク古い接続要求項目にArchive.orgリンクweb.archive.org/web/20130402211121/http://connect.microsoft.com/...
Anssssss

7

Martin Smithの答えUPDATE TRIGGERが示唆するアプローチを次のように実装しました。

CREATE TRIGGER trgAfterUpdateAsset ON dbo.Asset
FOR UPDATE AS
IF UPDATE(AssetTypeID) AND EXISTS (SELECT * FROM inserted i JOIN deleted d ON i.ID = d.ID WHERE i.AssetTypeID <> d.AssetTypeID)
BEGIN 
    RAISERROR ('AssetTypeID cannot change.', 16, 1);
    ROLLBACK TRAN
END     

(注:このテーブルには、IDと呼ばれる主キー列があります)。

AssetTypeIDの値が変更された場合にのみ、更新を拒否します。そのため、列は更新に存在する可能性があり、値が変更されなかった場合は、通過する可能性があります。(私はこの方法が必要でした)


1
特定のレコードについてがAssetTypeIDnull以外の値に設定されており、トリガーでfalseと評価され、その列が編集可能なままになるUPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_idためWHERE i.AssetTypeID <> d.AssetTypeID、ロールバックが実行されない場合。
クリスティアアンウェスターベーク

3

派生列を持つビューを使用できます。これを試して

create table ro_test(id int primary key, CreatedByUser int)
go
create view v_ro_test
as
select id, CreatedByUser*1 CreatedByUser from ro_test
go

insert into ro_test values(1,10);
update ro_test
set CreatedByUser =11
where id =1;
select * from v_ro_test;
go
--ERROR--
update v_ro_test
set CreatedByUser =10
where id =1;

--BUT--
update v_ro_test
set id =2
where id =1;
select * from v_ro_test;

どういう意味かわかりません。詳しく説明してもらえますか?
フィリップM

しかし、あなただけのテーブルを更新し、それの値は変更することができます
フィリップ・M

1
@Philipp Mただし、テーブルへのアクセスを取り消して、ビューに付与することができます。そうじゃない?
msi77

-3

createdby列を更新するのはなぜですか?

[created_by]列と[modified_by]列の2つの列があり、最初の挿入でレコード内のすべての列がすべて挿入され、その後の更新では[modified_by]列が更新されます(アプリケーションのトリガーを介してレイヤーを更新して、[modified_by]のみを変更し、それぞれの列を変更できます)


3
質問のポイントを見逃していると思います。列が更新可能ではないことを正確に実施するための組み込みサポートがあるかどうかを尋ねていました。
マーティンスミス

ちょうど@MartinSmith -我々としても変更された列を持っていないと私は読み取り専用存在するためにサポートが組み込まれているかどうかについて興味があった
フィリップ・Mを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.