在 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