Cibler les tables dans différents schémas de la procédure de stockage, mais ne modifiez pas le code

S'il vous plaît quelqu'un peut conseiller s'il est possible d'avoir une procédure stockée dans le schéma [dbo] sélectionner des données d'une table dans un schéma pour les users accédant via un rôle de database et pour sélectionner des données d'une table similaire dans un autre schéma pour les users accédant via un autre rôle de database?

Par exemple, si j'ai trois schémas dans ma database:

  • dbo
  • vert
  • rouge

J'ai deux connections de database [RedLogin] et [GreenLogin] . Ceux-ci se connectent à ma database en utilisant les users de bases de données respectifs [RedUser] et [GreenUser] . Ces users sont membres des rôles de database respectifs [RedRole] et [GreenRole] .

  • [RedUser] a un schéma par défaut de [red] .
  • [GreenUser] a un schéma par défaut de [vert] .
  • [RedRole] a l'autorisation d'exécution sur [dbo] et sélectionne l'autorisation sur le schéma [red] .
  • [GreenRole] a l'autorisation d'exécution sur [dbo] et sélectionne l'autorisation sur le schéma [vert] .
  • Dans le schéma [vert] j'ai une table appelée [Utilisateur] .
  • Dans le schéma [rouge] j'ai une table appelée [Utilisateur] .
  • Dans le schéma [dbo] j'ai une procédure stockée appelée [User_GetAll] qui s'exécute.

SELECT * FROM USER;

Ce que j'aimerais, c'est:

  • Pour les users qui se connectent avec [Redlogin] et appellent le [User_GetAll] get tous les users de la [rouge]. [User] table.
  • Pour les users qui se connectent avec [Greenlogin] et appellent le [User_GetAll] get tous les users de la [vert]. [User] table.

J'ai donc une question. Par exemple:

– schéma [dbo] dans le passé, j'avais 100 procédures stockées. Et maintenant, je ne veux pas changer de code dans la procédure stockée parce que c'est tellement, alors comment puis-je faire pour résoudre le problème? Aidez-moi, s'il vous plaît.

………………………………………….. …………………………….

Mettre à jour:

Pour un exemple simple:

J'ai un schéma [dbo] , et dans ce schéma, j'ai créé une procédure stockée dbo.GetAccount :

CREATE PROCEDURE dbo.GetAccount AS BEGIN SELECT * FROM tblAccountNet END 

Ensuite, j'ai créé un schéma [ABC] avec l'user nommé UserABC .

Maintenant, je voudrais me connecter avec UserABC et exécuter dbo.GetAccount pour le schéma [ABC] pour en get tous les users et ne pas vouloir changer le code de dbo.GetAccount . Alors, comment puis-je faire?

Voici mes idées pour le résoudre:

  1. Créez une autre procédure stockée dans le schéma [dbo] et utilisez-la pour lire toutes les autres procédures afin de les exécuter sur le schéma avec l'user lors de la connection. Puis-je faire cela? Alors, comment puis-je faire ça?
  2. Créez une procédure stockée pour modifier le schéma de toute la procédure [dbo] en [ABC]. Puis-je faire cela?

Merci de votre aide.

Votre meilleur pari ici serait d'utiliser SQL dynamic. C'est quelque chose qui vous permet de passer des variables de string dans un script qui est ensuite exécuté sur le moteur SQL. Par exemple, si vous avez des variables @dynamicsql et @usertype , vous devez créer une string SQL dyanmic comme:

 @dynamicsql = 'SELECT * FROM '+@usertype+'.tblAccountNet' 

Ensuite, vous devez exécuter ce code dans une procédure stockée en utilisant EXEC(@dynamicsql) . Cela fonctionnerait probablement, mais il nécessite des permissions supplémentaires pour l'user, et vous ouvre également à tout un monde de problèmes de security, le plus important étant les attaques par injection SQL. Donc, cela fonctionnerait probablement, mais cela pourrait être plus difficile que cela en vaut la peine.

http://xkcd.com/327/