特定の行の削除を制限したい。たとえば、誰かがテーブルを切り捨てたり、テーブルからすべてのレコードを削除したりする場合、エラーメッセージがスローされます。特定のIDの場合は許可されません。同じようにトリガーを使用しましたが、トランケート時にトリガーされないので、役に立ちません
Create TRIGGER vendorTrigger
ON [Vendor]
INSTEAD OF DELETE
AS
IF EXISTS(SELECT * FROM Vendor WHERE VendorId = 515)
BEGIN
RAISERROR ('Is not allowed to delete VendorId: 515 as it is of type corpnet',16, 1)
END
ELSE
BEGIN
Delete from Vendor Where VendorId in (Select VendorId From Vendor)
END
SQL Server 2016以降を使用している場合は、検討することをお勧めします 行レベルのセキュリティ
そうでない場合は、ビューを使用して特定の行へのアクセスを制限できます。役立つリンク:
TRUNCATE TABLEには、テーブルに対するALTER権限が必要です。テーブルの切り捨てを防ぐ最善の方法は、その権限を取り消すことです。
さらに、この操作では個々の行の削除がログに記録されないため、TRUNCATE TABLEはトリガーをアクティブ化できません。
詳しくは TRUNCATE TABLE(Transact-SQL) をご覧ください
アクセス許可は、特定の操作(TRUNCATE TABLEなど)を処理するための好ましい方法であることに同意します。
それでもうまくいかない場合は、特にTRUNCATE TABLEの場合、他のテーブルからこのテーブルを参照する外部キーを持つことができます。他のテーブルはダミーテーブルにすることができ、空にすることができます。 FKを無効にすることもできます。 FKが存在するため、TRUNCATE TABLEは禁止されています。
しかし、もちろん、十分な権限があれば、そのユーザーはFKの削除、ドロップ、テーブルの再作成などの操作を実行できます。等。