【问题标题】:Block Query Editor from altering views in SQL Server Management Studio阻止查询编辑器更改 SQL Server Management Studio 中的视图
【发布时间】:2014-08-14 14:38:53
【问题描述】:

在 SQL Server Management Studio 中处理视图时,我更喜欢将视图编写成 ALTER 语句,进行更改,正确格式化代码,然后执行语句。但是,有时当我编写一个以前使用过的视图时,我的格式会丢失,我会看到很多扩展属性添加到我的视图中。

据我所知,其他人一直在使用 SSMS 查询编辑器(设计器)来编辑视图,这很烦人,因为它完全破坏了我的格式。

有没有办法阻止用户使用设计器更改 SSMS 中的视图?理想情况下,一些数据库设置,但或者,一些会阻止设计者打开视图的黑客攻击。

务实的做法只是与用户交谈并让他们停止使用设计器,但我担心旧习惯很难改掉,我不想再花一分钟时间重新格式化我已经格式化的代码之前很多次...

【问题讨论】:

    标签: sql-server tsql sql-server-2008-r2 ssms


    【解决方案1】:

    不,没有一种可靠的方法可以做到这一点。

    添加设计者不支持但不改变语义的构造可能是一种可能性

    WHERE (1 = (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)))
    

    但是它并没有真正起作用。打开视图时,您会看到消息

    SQL 文本不能在网格窗格和图表窗格中表示。

    这些窗格是空白的,但 SQL 窗格仍然出现并包含重新格式化的 SQL 以供编辑。上述也有以负面方式改变执行计划的风险。

    另一种方法可能是创建 DDL 触发器。

    我为设计器和查询窗口看到的默认程序名称字符串是“Microsoft SQL Server Management Studio”和“Microsoft SQL Server Management Studio - Query”,因此您可以使用。

    CREATE TRIGGER NoAlterViewFromSSMS 
    ON DATABASE 
    FOR ALTER_VIEW
    AS 
       IF APP_NAME() = 'Microsoft SQL Server Management Studio'
       BEGIN
           RAISERROR ('Please don''t use the designer to ALTER views',16, 1)
           ROLLBACK
       END
    GO
    

    但这不会触发,直到他们尝试保存并且您的同事可能会非常生气。 management studio 使用的 AppName 无论如何都是可配置的,因此也可以绕过。

    我能想到的唯一其他选择是在 Connect 站点中搜索阻止设计器打开的错误(我隐约记得一个带有嵌套注释语法的错误),但即使你找到了一个,你也有可能会被在未来的服务包中修复。

    【讨论】:

      【解决方案2】:

      使用查询更改视图时的sql server 应用程序名称为Microsoft SQL Server Management Studio - Query,使用设计器更改视图时sql server 的应用程序名称为Microsoft SQL Server Management Studio

      您可以为 ALTER_VIEW 创建 DDL 触发器,以检查 APP_Name() 并限制您的用户使用查询而不是设计器。

      CREATE TRIGGER LimitUseDesignerForView ON DATABASE 
      FOR ALTER_VIEW
      AS 
         IF APP_NAME() = 'Microsoft SQL Server Management Studio'
         BEGIN
             RAISERROR ('Use query in order to alter your view',16, 1)
             ROLLBACK
         END
      GO
      

      您还可以通过以下查询获取使用设计器的 sql server 视图列表:

      SELECT DISTINCT OBJECT_NAME(ep.major_id) 
      FROM sys.extended_properties ep
      WHERE ep.name LIKE 'MS_DiagramPane%'
      

      我建议您不要通过APP_NAME() 限制您的用户,因为用户可能会使用工具应用程序来使用视图设计器,例如 EMS 等。

      您可以通过使用DDL_EXTENDED_PROPERTY_EVENTS DDL 触发器的限制来限制您的用户。

      CREATE TRIGGER LimitUseDesignerForView ON DATABASE 
      FOR DDL_EXTENDED_PROPERTY_EVENTS
      AS 
          IF (EVENTDATA().value('(/EVENT_INSTANCE/Parameters/Param)[1]','nvarchar(max)') LIKE 'MS_DiagramPane%') BEGIN
              RAISERROR ('Use query in order to alter your view',16, 1)
              ROLLBACK 
          End
      GO
      

      【讨论】:

        【解决方案3】:

        也许您可以撤销用户的 Alter Schema 权限,这应该会阻止他们运行 ALTER View 语句。

        您可以将 ALTER SCHEMA 权限授予其他用户并允许自己模拟,然后使用 EXECUTE AS 更新您的视图:

        GRANT ALTER ON SCHEMA :: dbo TO user2;
        REVOKE ALTER ON SCHEMA :: dbo TO user1;
        
        GRANT IMPERSONATE ON USER:: user2 TO user1;
        
        -- Alter view script
        EXECUTE AS USER = 'user2';
        
        ALTER VIEW ......
        
        EXECUTE AS USER = 'user1';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-02
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多