我希望用户查看服务器上每个数据库中的所有表和视图。我还希望他们看到视图定义。这样,我还希望能够看到视图是如何创建的。也就是视图里面的查询不是结果
我应该授予他们什么服务器级别的访问权限才能做到这一点?我们有几个数据库,每个数据库中有大量的视图和表。我不想一一手动做
谢谢
我希望用户查看服务器上每个数据库中的所有表和视图。我还希望他们看到视图定义。这样,我还希望能够看到视图是如何创建的。也就是视图里面的查询不是结果
我应该授予他们什么服务器级别的访问权限才能做到这一点?我们有几个数据库,每个数据库中有大量的视图和表。我不想一一手动做
谢谢
GRANT VIEW DEFINITION TO [user];
将允许用户查看数据库中结构的定义,包括表、视图、存储过程等。您需要为实例上的每个数据库执行此操作。没有开箱即用的服务器范围等效项将权限限制为仅数据库级别。
如果您需要将其限制为单个模式,那么您可以:
GRANT VIEW DEFINITION ON schema::[name_of_schema] TO [user];
如果您只希望他们能够看到表和视图的定义(而不是存储的过程等),那么您需要为您希望他们看到定义的每个对象进行一次授权。您可以
GRANT
使用以下查询为数据库级别的表和视图生成语句:有关详细信息,请参阅 Microsoft Docs,网址为https://learn.microsoft.com/en-us/sql/t-sql/statements/grant-database-principal-permissions-transact-sql?view=sql-server-ver15
如果您愿意在服务器级别为登录分配更多权限,您可以执行以下操作:
这将允许他们在他们有权访问的任何数据库中查看任何对象的定义,并且还将允许他们在服务器级别查看端点等事物的定义。
您不能在服务器级别分配权限以仅查看表和视图定义,因此以下一组服务器级别授权并不完全符合您的要求,但它是获得所需内容的最低服务器级别权限。VIEW ANY DEFINITION 将允许用户查看所有数据库对象的定义,而不仅仅是表和视图。因此登录将能够看到存储过程、函数等的定义。
如果您希望用户只能看到表和视图定义,则需要在每个视图和表上授予 VIEW DEFINITION。这可以自动化以减轻痛苦,但如果查看任何对象定义的附加权限是可以的,那么上面列出的服务器上的授权将满足您的需要。
原则上,您应该始终努力创建一个适合您需要的角色,而不是授予用户所需的所有权限。虽然这可能违反直觉,但当“用户离开”、另一个用户需要“相同的权限”、“重新创建用户”等时,它会证明是非常有价值的。一个例子来说明这一点,用户 A 已经工作了很多年,是一个一流的人,并创造和运行了许多“在自己的个人用户下”的工作。有一天他继续工作并获得另一份工作,人力资源部要求您立即删除该用户,第二天的工作 1..n 不运行。
您尝试将所有工作传递给担任该角色的新用户... 噩梦 #1 列表很广泛,您不想过那些日子。
相反,您创建一个或多个角色,具有所需的所有权限,并为用户分配这些(或单个)角色。用户离开后,您将其删除,创建一个新用户,授予相同的角色,然后离开。第二天,这只是天堂里的另一天。
干杯