Sql Server では、ユーザーが特定の拡張プロパティでマークされたオブジェクトを削除できないようにしたいと考えています。これは、DROP イベントの DDL トリガーで簡単に実現できると考えました。結局のところ、これらのトリガーはオブジェクトがドロップされた後に起動されるため、拡張プロパティにアクセスできなくなり、イベント データで使用できなくなります。
DDL トリガーでドロップされたオブジェクトの拡張プロパティにアクセスする方法はありますか?
拡張プロパティが既に削除されているため、以下のコードは機能しません。
CREATE TRIGGER PreventDeletionOfAutogeneratedTriggers ON DATABASE
FOR DROP_TRIGGER
AS
DECLARE @TriggerName sysname = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
DECLARE @TriggerSchema sysname = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')
DECLARE @ObjectId int = OBJECT_ID(QUOTENAME(@TriggerSchema) + '.' + QUOTENAME(@TriggerName))
IF EXISTS (
SELECT
*
FROM
sys.extended_properties
WHERE
major_id = @ObjectId AND
name = 'Autogenerated'
)
BEGIN
RAISERROR ('Cannot drop triggers that are autogenerated.',16, 10)
ROLLBACK
END
GO