为用户创建仅查看一个视图的权限

时间:2015-02-12 07:37:56

标签: sql sql-server login permissions

我有一个db并创建登录和用户, 该用户无法看到任何内容。

grant select on GuestView to PublicLogin

此用户看到此视图后 但用户可以选择任何东西

我的问题

为什么我可以锁定用户进行任何选择插入/更新? 我试过这个 它不起作用。

 SELECT 'REVOKE SELECT ON ' + quotename('dbo') + '.' + quotename('AccessCheckpoint') + ' TO PublicLogin' FROM INFORMATION_SCHEMA.TABLES

 SELECT 'REVOKE UPDATE ON ' + quotename('dbo') + '.' + quotename('AccessCheckpoint') + ' TO PublicLogin' FROM INFORMATION_SCHEMA.TABLES 

SELECT 'REVOKE INSERT ON ' + quotename('dbo') + '.' + quotename('AccessCheckpoint') + ' TO PublicLogin' FROM INFORMATION_SCHEMA.TABLES 

SELECT 'REVOKE DELETE ON ' + quotename('dbo') + '.' + quotename('AccessCheckpoint') + ' TO PublicLogin' FROM INFORMATION_SCHEMA.TABLES 

SELECT 'REVOKE EXECUTE ON ' + quotename('dbo') + '.' + quotename('AccessCheckpoint') + ' TO PublicLogin' FROM INFORMATION_SCHEMA.TABLES

但是再次选择正常工作

select *from AccessCheckpoint

1 个答案:

答案 0 :(得分:1)

DECLARE @TableUsedInView NVARCHAR(100)
DECLARE @TableUsedInView2 NVARCHAR(100)
SET @TableUsedInView='PulibcTable1'
SET @TableUsedInView2='PulibcTable2'

SELECT 'REVOKE SELECT ON ' + quotename(table_schema) + '.' + quotename(table_name) + ' TO PublicLogin' 
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name NOT IN(@TableUsedInView,@TableUsedInView2)


SELECT 'REVOKE UPDATE ON ' + quotename(table_schema) + '.' + quotename(table_name) + ' TO PublicLogin' 
FROM INFORMATION_SCHEMA.TABLES


SELECT 'REVOKE DELETE ON ' + quotename(table_schema) + '.' + quotename(table_name) + ' TO PublicLogin' 
FROM INFORMATION_SCHEMA.TABLES



SELECT 'REVOKE INSERT ON ' + quotename(table_schema) + '.' + quotename(table_name) + ' TO PublicLogin' 
FROM INFORMATION_SCHEMA.TABLES


SELECT 'REVOKE EXECUTE ON ' + quotename(routine_schema) + '.' + quotename(routine_name) + ' TO PublicLogin' 
FROM INFORMATION_SCHEMA.ROUTINES

SELECT 'GRANT SELECT ON GuestView to PublicLogin'
SELECT 'GRANT SELECT ON ' + @TableUsedInView + ' TO PublicLogin'
SELECT 'GRANT SELECT ON ' + @TableUsedInView2 + ' TO PublicLogin'

复制这些结果并将其粘贴到新的查询窗口并运行它们。您应该检查输出,以确保只包含您需要的视图和过程。

更新:

这是为了确保用户之前没有表上的任何权限。如果按照我上面的说法执行操作,您可以在访客视图中创建以下查询:

SELECT *    
    FROM PulibcTable1 AS P
    INNER JOIN PulibcTable2 AS P2 ON P.UserID=P2.UserID

但是如果您在视图中看到公共登录将无法获取行:

SELECT *    
    FROM InternTable 
  

这是因为他只能从2个表中读取