代码之家  ›  专栏  ›  技术社区  ›  Will Rickards

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

  •  2
  • Will Rickards  · 技术社区  · 15 年前

    目标:当其他人从MyTable中选择*时,他们会看到表的一个版本。但是当一个特定的用户从myTable中选择*时,他们会看到表的另一个版本。

    我觉得我在创建一个新角色并将单个用户加入其中的过程中已经走到了一半。然后使用select*从dbo.mytable创建默认表的副本到newrole.mytable。但是当用户从mytable中选择*时,他们仍然可以看到dbo.mytable。如何使它们默认为newRole.myTable?我仍然需要他们看到所有其他dbo表,而不是这个表。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Mark Brackett Achilles Ram Nakirekanti    15 年前

    创建一个新的模式,并在其中创建一个重复的表(或者,如果需要,在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
  •   ldog    15 年前

    我不知道这是否有帮助,但您可以用相同的名称查看不同的表,以下是摘录 http://www.w3schools.com/SQl/sql_view.asp :

    在SQL中,视图是基于SQL语句的结果集的虚拟表。

    视图包含行和列,就像真实的表一样。视图中的字段是数据库中一个或多个实表中的字段。

    您可以将SQL函数、WHERE和JOIN语句添加到视图中,并将数据呈现为来自单个表的数据。

        3
  •  1
  •   Jeff Cooper    15 年前

    我主要使用Postgres,所以Ymmv,但是在Postgres中你需要

    1)创建新模式,最好由新角色拥有,并将表放入其中。 2)将搜索路径变量设置为在另一个模式之前包含该模式。

    希望它有帮助。

        4
  •  -1
  •   Spencer Ruport    15 年前

    这是个很坏的主意。我不知道人们为什么要尝试所有这些疯狂的方法来提高安全性,但这显然是适得其反的。

    最终,每个安全系统都归结为以下几行 if(User.HasAccessTo(object)) .事实上,如果您设计了一个经过深思熟虑的安全系统,那么它应该是如何工作的。认证检查越不连贯,就越有可能出错。如果只有某些用户可以访问某些记录信息,则应向这些记录添加一个标志,并基于该标志验证访问权限。