【发布时间】:2015-03-17 11:43:33
【问题描述】:
在 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
【问题讨论】:
-
“在 Sql Server 中我想阻止用户”——这通常是通过权限来完成的。用户应该只需要读取和有限的执行权限
-
是的,你当然是对的,但在这种情况下,“用户”是系统管理员,他们应该被告知删除这些对象的正确方法,而不是阻止这样做。
标签: sql sql-server ddl-trigger