Как заставить одного пользователя увидеть другую таблицу с тем же именем - PullRequest
2 голосов
/ 07 августа 2009

Цель: когда все остальные делают SELECT * ИЗ mytable, они видят одну версию таблицы. Но когда конкретный пользователь делает SELECT * FROM mytable, он видит другую версию таблицы.

Я думаю, что я на полпути к созданию новой роли и включению в нее одного пользователя. Затем создайте копию таблицы по умолчанию с помощью SELECT * INTO newrole.mytable FROM dbo.mytable. Но когда пользователь делает SELECT * FROM mytable, он все равно видит dbo.mytable. Как мне получить их по умолчанию для newrole.mytable? Мне все еще нужны они, чтобы увидеть все остальные таблицы dbo, но не эту.

Ответы [ 4 ]

1 голос
/ 08 августа 2009

Я использую в основном Postgres, поэтому YMMV, но в postgres вам нужно

1) Создайте новую схему, предпочтительно принадлежащую новой роли, и поместите в нее таблицу 2) Установите переменную search_path, чтобы включить эту схему ДО другой.

Надеюсь, это поможет.

1 голос
/ 08 августа 2009

Создайте в ней новую схему и дубликат таблицы (или просмотрите 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
1 голос
/ 08 августа 2009

Я не знаю, может ли это помочь, но вы можете просмотреть другую таблицу с тем же именем, вот выдержка из http://www.w3schools.com/SQl/sql_view.asp:

В SQL представление - это виртуальная таблица, основанная на наборе результатов оператора SQL.

Представление содержит строки и столбцы, как в реальной таблице. Поля в представлении - это поля из одной или нескольких реальных таблиц в базе данных.

Вы можете добавить функции SQL, операторы WHERE и JOIN в представление и представить данные, как если бы данные приходили из одной таблицы.

0 голосов
/ 08 августа 2009

Это очень плохая идея. Я не уверен, почему люди пытаются использовать все эти безумные методы для повышения безопасности, но это просто контрпродуктивно.

В конечном итоге каждая система безопасности сводится к некоторой строке, подобной следующей if(User.HasAccessTo(object)). На самом деле, если вы разработали хорошо продуманную систему безопасности, это почти точно так, как она должна работать. Чем больше разрозненных проверок подлинности, тем больше вероятность, что вы допустите ошибку. Если только некоторые пользователи имеют доступ к определенной информации о записи, вы должны добавить флаг к этим записям и проверить доступ на основании этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...