1

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
4

1 に答える 1