如何让一个用户看到具有相同名称的其他表

时间:2009-08-07 19:56:39

标签: sql sql-server-2005 tsql

目标:当其他人都做SELECT * FROM mytable时,他们会看到该表的一个版本。但是当特定用户执行SELECT * FROM mytable时,他们会看到该表的另一个版本。

我认为我就像创建一个新角色并将单个用户放入其中一样。然后使用SELECT * INTO newrole.mytable FROM dbo.mytable创建默认表的副本。但是当用户执行SELECT * FROM mytable时,他们仍然会看到dbo.mytable。如何让它们默认为newrole.mytable?我仍然需要他们看到所有其他dbo表而不是这一个。

4 个答案:

答案 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))。事实上,如果你设计了一个经过深思熟虑的安全系统,那几乎就是它应该如何工作的。您的身份验证检查越离散,您就越有可能犯错误。如果只有一些用户可以访问某些记录信息,您应该为这些记录添加一个标志,并根据该记录验证访问权。