Sql server 如何使用t-sql权限向某人显示表中记录的子集?

Sql server 如何使用t-sql权限向某人显示表中记录的子集?,sql-server,Sql Server,我在MicrosoftSQLServer2008中有一个包含许多记录的表。某些记录设置了布尔标志。其他人则不然 我希望用户只能看到设置了标志的记录。我创建了一个使用select语句查询这些记录的视图,并授予用户对此视图的读取权限。但是,由于视图从原始表中选择,SQL server表示用户没有足够的权限查看该视图 视图和表位于同一数据库中 如何设置权限(使用视图或其他方法),以便用户只能看到此表中的记录子集 这完全符合它的工作原理: USE tempdb; GO CREATE TABLE dbo.

我在MicrosoftSQLServer2008中有一个包含许多记录的表。某些记录设置了布尔标志。其他人则不然

我希望用户只能看到设置了标志的记录。我创建了一个使用select语句查询这些记录的视图,并授予用户对此视图的读取权限。但是,由于视图从原始表中选择,SQL server表示用户没有足够的权限查看该视图

视图和表位于同一数据库中


如何设置权限(使用视图或其他方法),以便用户只能看到此表中的记录子集

这完全符合它的工作原理:

USE tempdb;
GO
CREATE TABLE dbo.MyFlags(a INT, flag BIT);
GO
INSERT dbo.MyFlags VALUES(1,0),(2,1),(3,1);
GO
CREATE VIEW dbo.vMyFlags 
AS
  SELECT a, flag FROM dbo.MyFlags WHERE flag = 1;
GO
CREATE LOGIN smudge WITH PASSWORD = 'floob', CHECK_POLICY = OFF;
GO
CREATE USER smudge FROM LOGIN smudge;
GO
GRANT SELECT ON dbo.vMyFlags TO smudge;
GO
EXECUTE AS user = 'smudge';
GO
-- from view (succeeds):
SELECT a,flag FROM dbo.vMyFlags;
GO
-- from table (error):
SELECT a,flag FROM dbo.MyFlags;
GO

可能您错过了一个步骤,或者创建或引用了没有正确模式前缀的对象

这完全符合它的工作原理:

USE tempdb;
GO
CREATE TABLE dbo.MyFlags(a INT, flag BIT);
GO
INSERT dbo.MyFlags VALUES(1,0),(2,1),(3,1);
GO
CREATE VIEW dbo.vMyFlags 
AS
  SELECT a, flag FROM dbo.MyFlags WHERE flag = 1;
GO
CREATE LOGIN smudge WITH PASSWORD = 'floob', CHECK_POLICY = OFF;
GO
CREATE USER smudge FROM LOGIN smudge;
GO
GRANT SELECT ON dbo.vMyFlags TO smudge;
GO
EXECUTE AS user = 'smudge';
GO
-- from view (succeeds):
SELECT a,flag FROM dbo.vMyFlags;
GO
-- from table (error):
SELECT a,flag FROM dbo.MyFlags;
GO

可能您错过了一个步骤,或者创建或引用了没有正确模式前缀的对象

谁是视图的所有者?谁是基础表的所有者?它们是否在同一数据库中?谁是视图的所有者?谁是基础表的所有者?它们在同一个数据库中吗?