immutable
MSSQLで列をマークすることは可能ですか?
便利な DDL 機能のようです。値が行に設定されると (「行」は主キーに対する値の特定の関係として定義されます)、その行を削除しないと変更できませんでした。
明らかに (ほとんどの場合と同様)、これはアプリケーション層で実行できる以上のものですが、SQL DDL の楽しみの半分は、アプリケーション コードのエラー チェックです。
immutable
MSSQLで列をマークすることは可能ですか?
便利な DDL 機能のようです。値が行に設定されると (「行」は主キーに対する値の特定の関係として定義されます)、その行を削除しないと変更できませんでした。
明らかに (ほとんどの場合と同様)、これはアプリケーション層で実行できる以上のものですが、SQL DDL の楽しみの半分は、アプリケーション コードのエラー チェックです。
DML を実行しているユーザーがオブジェクトの所有者ではなく、データベース自体の「db_owner」でもない場合は、「挿入」権限のみを付与できますが、そのテーブルの更新権限は付与できません。
次のテーブルがあると仮定しますid, col1, col2
grant insert, select, delete on the_table to the_user;
grant update (id, col2) on the_table to the_user;
これらの許可により、_user は行を挿入し、3 つの列すべてに値を指定できます。彼は、id
およびcol2
列も更新できますが、列は更新できませんcol1
。
db_owner (および場合によってはテーブルの作成者/所有者) は、常にすべての列を更新できます。それらのロールからその特権を取り消す方法があるかどうかはわかりません。
いいえ、SQL Server にはそのような機能はありません。
私が考えることができる最も近いのは、特定の列の値が論理テーブルと同じであるかどうかをチェックし、変更された行の更新を拒否するテーブルの更新トリガーINSERTED
ですDELETED
。
私の知る限り、これは DDL では不可能です。ただし、要件を満たすために BEFORE UPDATE トリガーを実装できます。BEFORE UPDATE トリガーでは、行を更新するのではなく、例外を発生させたり、必要なことを行うことができます。
もう 1 つの方法は、テーブルに対する更新権限を拒否し、不変フィールドを更新しないストアド プロシージャ (ユーザーには実行権限がある) を作成することです。