【问题标题】:Restrict Sql User do not access any other databases and any other objects other than granted views限制 Sql 用户不访问任何其他数据库和授予视图以外的任何其他对象
【发布时间】:2020-12-16 14:57:54
【问题描述】:

我需要创建一些视图,并且我需要允许用户(登录)访问仅授予他的视图,我使用了休闲脚本。

USE master;
GO
CREATE LOGIN [MYLogin] WITH PASSWORD = 'Password@123'
USE [TEST]
CREATE USER [MYUser] FROM LOGIN [MYLogin]
CREATE ROLE [MYUserRead]
EXEC sp_addrolemember 'MYUserRead','MYUser'
GO
CREATE VIEW viGetA
AS
  SELECT * from dbo.A
GO 
GRANT SELECT ON viGetA TO [MYUserRead]
GO

我只能查看当我使用上面创建的用户帐户 MYLogin 登录时授予的视图,但我可以看到主数据库、其他数据库(即使我无法从用户创建的数据库访问对象)但我是能够访问Test数据库和master数据库的sys视图和sys过程。

如何限制用户在登录管理工作室时不查看任何其他数据库,如 master、temp、MyDatabse ..etc 和任何系统对象(sys 视图、DMV)。

请帮助我们为用户提供脚本,这些用户只能查看一个数据库,并且只能查看为该用户角色授予的视图。

请查看下图以供参考。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    要对所有用户隐藏所有数据库,您应该明确拒绝VIEW ANY DATABASE 权限。

    这将从 [MYLogin] 中“隐藏”所有数据库:

    USE MASTER
    GO
    DENY VIEW ANY DATABASE TO [MYLogin];
    GO
    

    当然,您可以单独拒绝/授予任何数据库登录的权限。 如果您为PUBLIC 服务器角色执行此操作,则会对所有用户隐藏所有数据库。小心点!

    始终首先在非生产环境中测试权限更改!

    系统视图不同,它们也需要运行 SQL Server 或其他应用程序(如 SSMS)才能正常运行,但是您可以尝试在整个 sysINFORMATION_SCHEMA 架构上拒绝选择。

    DENY SELECT ON SCHEMA::sys TO [MYLogin]
    DENY SELECT ON SCHEMA::INFORMATION_SCHEMA TO [MYLogin]
    

    但是,这可能会导致 SSMS 无法加载有关数据库中可用的数据库/对象的任何信息。

    始终首先在非生产环境中测试权限更改!

    您也可以在数据库中为用户拒绝VIEW ANY DEFINITION,以防止它看到视图定义(视图后面的选择)。

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 2019-10-03
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2012-10-02
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多