如果我希望用户查看服务器中每个数据库中的所有表和视图(视图定义),我应该给予用户什么授权

mas*_*low 7 sql-server permissions

我希望用户查看服务器上每个数据库中的所有表和视图。我还希望他们看到视图定义。通过这个,我还希望能够看到视图是如何创建的。也就是视图里面的查询不是结果

我应该授予他们什么服务器级别的访问权限才能做到这一点?我们有几个数据库,每个数据库中有大量的视图和表。我不想一一手动完成

谢谢

Han*_*non 7

GRANT VIEW DEFINITION TO [user]; 将允许用户查看数据库中结构的定义,包括表、视图、存储过程等。

您需要为实例上的每个数据库执行此操作。没有开箱即用的服务器范围等效项将权限限制为仅数据库级别。

如果您需要将其限制为单个模式,那么您可以这样做:

GRANT VIEW DEFINITION ON schema::[name_of_schema] TO [user];

如果您只希望他们能够看到表和视图的定义(而不是存储过程等),那么您需要为您希望他们看到定义的每个对象执行一次授权。您可以GRANT使用以下查询在数据库级别为表和视图生成语句:

SELECT
      ObjectType = o.type_desc
    , ObjectName = o.name
    , GrantStatement = N'GRANT VIEW DEFINITION ON ' + QUOTENAME(o.name) + N' TO [user];'
FROM sys.objects o
WHERE o.type = N'U'
    OR o.type = N'V'
ORDER BY o.type
    , o.name;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅 Microsoft Docs,网址https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-database-principal-permissions-transact-sql?view=sql-server-ver15

如果您愿意为登录分配更多权限,则在服务器级别,您可以执行以下操作:

GRANT VIEW ANY DEFINITION TO [name_of_login];
Run Code Online (Sandbox Code Playgroud)

这将使他们能够在他们有权访问的任何数据库中查看任何对象的定义,并且还将允许他们在服务器级别查看端点等事物的定义。


Ton*_*kle 5

您不能在服务器级别分配权限以仅查看表和视图定义,因此以下服务器级别授权并不完全符合您的要求,但它是获得您想要的最低服务器级别权限。VIEW ANY DEFINITION 将允许用户查看所有数据库对象的定义,而不仅仅是表和视图。因此登录将能够看到存储过程、函数等的定义。

GRANT CONNECT ANY DATABASE TO [user]
GRANT CONNECT SQL TO [user]
GRANT VIEW ANY DATABASE TO [user]
GRANT VIEW ANY DEFINITION TO [user]
Run Code Online (Sandbox Code Playgroud)

如果您希望用户只能看到表和视图定义,则需要对每个视图和表授予 VIEW DEFINITION。这可以自动化以减轻痛苦,但是如果查看任何对象定义的附加权限没有问题,那么上面列出的服务器上的授权将满足您的需要。