2009-08-07 7 views
2

Objectif: Lorsque tout le monde sélectionne SELECT * FROM mytable, il voit une version de la table. Mais lorsqu'un utilisateur spécifique sélectionne SELECT * FROM mytable, il voit une autre version de la table.Comment faire pour qu'un utilisateur voit une table différente avec le même nom

Je pense que je suis à mi-chemin avec la création d'un nouveau rôle et la mise en place de l'utilisateur unique. Puis en créant une copie de la table par défaut avec SELECT * INTO newrole.mytable FROM dbo.mytable. Mais lorsque l'utilisateur sélectionne SELECT * FROM mytable, il voit toujours le fichier dbo.mytable. Comment puis-je les faire passer par défaut à newrole.mytable? J'ai encore besoin d'eux pour voir toutes les autres tables dbo juste pas celle-ci.

+0

Pourquoi voulez-vous faire cela? On dirait que vous allez créer un cauchemar d'entretien. Envisagez de créer des bases de données distinctes, des tables ou d'ajouter un champ (par exemple, IsAdminUser) et de l'inclure dans une clause WHERE. –

+1

Que faites-vous dans le monde? –

+1

@ Spencer Ruport, @Bob Kaufman. Je ne peux pas répondre pour l'affiche originale mais ma première pensée était pour des raisons de sécurité. Certains champs d'une table nécessitent une autorisation de sécurité plus élevée par exemple. Un vieil ami a discuté de certaines recherches sur cette idée avec moi il y a des années, mais je ne sais pas ce que font les bases de données modernes pour protéger des domaines plus sensibles. –

Répondre

1

Créez un nouveau schéma, et une table en double (ou une vue sur dbo.table si c'est ce que vous voulez) - par exemple, otheruser.table. Ensuite, définissez la connexion de l'utilisateur par défaut à ce schéma:

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 
+0

sont des schémas dans SQL Server 2000? L'implémentation sera en 2005 mais j'ai 2000 sur mon instance de test. –

+0

Comment géreriez-vous des rôles mixtes si vous utilisez des schémas? –

+0

Cette approche est également mauvaise si MyTable dans l'un ou l'autre schéma est identique. –

1

Je ne sais pas si cela peut aider, mais vous pouvez être en mesure de faire une vue d'une autre table avec le même nom, voici un extrait de http://www.w3schools.com/SQl/sql_view.asp:

Dans SQL, une vue est un virtuel table basée sur le jeu de résultats d'une instruction SQL.

Une vue contient des lignes et des colonnes, tout comme une table réelle. Les champs d'une vue sont des champs d'une ou de plusieurs tables réelles de la base de données.

Vous pouvez ajouter des instructions SQL, WHERE et JOIN à une vue et présenter les données comme si les données provenaient d'une seule table.

+0

Vous ne pouvez pas créer une vue portant le même nom qu'une table existante dans le même schéma. Si vous essayez, vous obtiendrez erreur Msg 2714 ("objet avec ce nom existe déjà"). – Rick

+0

Si vous ne placez pas cette vue dans un schéma différent, vous ne pouvez pas créer une vue portant le même nom qu'une table. En outre, vous ne pouvez pas diriger un utilisateur spécifique vers une vue au lieu d'une table. Ceci, franchement, ne répond pas du tout à la question - et est également incorrect. –

-1

Ceci est une très mauvaise idée. Je ne sais pas pourquoi les gens essaient toutes ces méthodes folles pour améliorer la sécurité, mais c'est tout simplement contre-productif.

En fin de compte, chaque système de sécurité se résume à une ligne comme if(User.HasAccessTo(object)). En fait, si vous avez conçu un système de sécurité bien pensé, c'est presque exactement comme cela devrait fonctionner. Plus vos vérifications d'authentification sont disjointes, plus vous risquez de commettre une erreur. Si seuls certains utilisateurs ont accès à certaines informations d'enregistrement, vous devez ajouter un indicateur à ces enregistrements et vérifier l'accès en fonction de ces informations.

1

J'utilise Postgres surtout, si YMMV, mais postgres vous devez

1) Créer le nouveau schéma, de préférence appartenant au nouveau rôle et placez-y la table 2) Définissez la variable search_path pour inclure ce schéma AVANT l'autre.

Espérons que ça aide.

Questions connexes