【问题标题】:Access extended properties for dropped object in DDL triggers访问 DDL 触发器中已删除对象的扩展属性
【发布时间】: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


【解决方案1】:

目前,DDL 触发器仅在 DDL 语句完成后触发,这意味着您将无权访问相应的元数据以强制执行回滚。

DDL 语句不存在 INSTEAD OF 触发器,这基本上是您完成此任务所需要的。

您可以在此处投票支持 INSTEAD OF DDL 触发器: https://connect.microsoft.com/SQLServer/feedback/details/243986

我的建议是将这些对象放在一个单独的架构中并在架构上设置权限,或者通过用户角色和权限锁定它们。

这里是有关 DDL 触发器的更多信息的链接。 https://technet.microsoft.com/en-us/library/ms175941(v=sql.120).aspx

【讨论】:

  • 我认为您的架构建议很好,但似乎 Robin 可能想要限制删除触发器,但不一定是父表。两者必须在同一个架构中,因此在架构级别锁定是有问题的。
  • 感谢您的建议,但实际上我不想完全阻止丢弃这些对象的可能性。它们是由工具生成的,删除它们的常用方法是使用该工具,并且触发器在那里通知。无论如何,似乎没有办法完成我想要的,所以它必须等到连接票完成(现在任何十年:))。
猜你喜欢
  • 2010-12-28
  • 2015-01-10
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2021-02-01
  • 2015-07-23
相关资源
最近更新 更多