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:
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] .
SELECT * FROM USER;
Ce que j'aimerais, c'est:
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:
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.