目标:当其他人都做SELECT * FROM mytable时,他们会看到该表的一个版本。但是当特定用户执行SELECT * FROM mytable时,他们会看到该表的另一个版本。
我认为我就像创建一个新角色并将单个用户放入其中一样。然后使用SELECT * INTO newrole.mytable FROM dbo.mytable创建默认表的副本。但是当用户执行SELECT * FROM mytable时,他们仍然会看到dbo.mytable。如何让它们默认为newrole.mytable?我仍然需要他们看到所有其他dbo表而不是这一个。
答案 0 :(得分:1)
我不知道这是否有帮助,但您可以查看具有相同名称的其他表格,这里摘录自http://www.w3schools.com/SQl/sql_view.asp:
在SQL中,视图是基于SQL语句的结果集的虚拟表。
视图包含行和列,就像真实表一样。视图中的字段是数据库中一个或多个真实表的字段。
您可以将SQL函数,WHERE和JOIN语句添加到视图中,并将数据呈现为数据来自一个表。
答案 1 :(得分:1)
创建一个新模式,并在其中创建一个重复的表(或视图到dbo.table,如果这是你想要的) - 例如。,otheruser.table。然后,将用户的登录名设置为默认为该架构:
USE atest
GO
CREATE ROLE [arole]
GO
CREATE SCHEMA [aschema] AUTHORIZATION [arole]
GO
CREATE USER [auser] FOR LOGIN [modify_user] WITH DEFAULT_SCHEMA = aschema
GO
EXEC sp_addrolemember 'arole', 'auser'
GO
CREATE TABLE dbo.atable ( col1 int )
GO
CREATE TABLE aschema.atable (col2 varchar(10))
GO
INSERT INTO dbo.atable( col1 ) VALUES( 1 )
GO
INSERT INTO aschema.atable( col2 ) VALUES( 'One' )
GO
PRINT 'dbo'
SELECT * FROM atable
GO
EXECUTE AS USER = 'auser'
GO
PRINT 'aschema'
SELECT * FROM atable
GO
REVERT
GO
答案 2 :(得分:1)
我主要使用Postgres,所以YMMV,但在postgres中你需要
1)创建新模式,最好由新角色拥有,并将表格放入其中 2)将search_path变量设置为在另一个之前包含该模式。
希望它有所帮助。
答案 3 :(得分:-1)
这是一个非常糟糕的主意。我不确定为什么人们会尝试所有这些疯狂的方法来提高安全性,但这只会产生相反的效果。
最终,每个安全系统都归结为某些行,如下面的if(User.HasAccessTo(object))
。事实上,如果你设计了一个经过深思熟虑的安全系统,那几乎就是它应该如何工作的。您的身份验证检查越离散,您就越有可能犯错误。如果只有一些用户可以访问某些记录信息,您应该为这些记录添加一个标志,并根据该记录验证访问权。