2009-03-23 9 views
0

J'ai un compte d'administrateur pour mon site Web où j'ajoute de nouveaux clients. Lorsqu'un nouveau client est ajouté, il obtient un compte et sa propre base de données.Comment puis-je créer une base de données sur mon serveur à partir du Web?

Le problème est que je ne peux pas créer de nouvelles bases de données sur mon serveur à partir de mon compte administrateur. En l'exécutant localement, je peux ajouter une base de données localement. Mais, lorsque je tente d'ajouter au serveur exécutant mon site hors du serveur, je reçois

CREATE DATABASE permission denied in database 'master'. 

Je suis en mesure d'ajouter la base de données (localement) quelques façons. Voici l'une des versions de travail les plus simples:

tmpConn.ConnectionString = "Data Source=.\\SQLEXPRESS; DATABASE = master;Integrated Security=True;"; 
sqlCreateDBQuery = " CREATE DATABASE " + dbname; 

SqlCommand myCommand = new SqlCommand(sqlCreateDBQuery, tmpConn); 
try 
{ 
    tmpConn.Open(); 
    myCommand.ExecuteNonQuery(); 

} 
catch (System.Exception ex) 
{} 

Répondre

0

Vous devez contacter votre fournisseur de services. (Ou le mainteneur du serveur).

+0

Ce n'est pas encore sur le web, juste un serveur de test, donc je suis le mainteneur actuel du serveur. Que puis-je faire en tant que responsable du serveur? –

-1

Vérifiez les autorisations pour MySQL: Votre compte d'administrateur a-t-il des paramètres différents pour une connexion locale par rapport à un hôte?

+0

Ce n'est pas une chaîne de connexion MySQL dans la question. –

0

Vous devez créer une base de données et créer des autorisations utilisateur de base de données. Votre fournisseur de services devrait être en mesure de faciliter cela.

0

Quelque chose d'autre que personne n'a suggéré est quel genre de validation que vous faites sur la valeur dbname. Êtes-vous sûr qu'il n'y a pas d'espace dedans? Ce n'est pas un mot réservé? Qu'il ne contient pas de code malveillant? À tout le moins, vous devez envelopper entre crochets:

sqlCreateDBQuery = String.Format(" CREATE DATABASE [{0}]", dbname); 

J'espère vraiment que vous n'êtes pas permettre à l'utilisateur de taper ce nom directement dans une zone de texte quelque part. Même si vous utilisez la sécurité de la propriété sur l'entrée initiale et que celle-ci est retirée d'une base de données «clients» commune quelconque, vous pouvez vous mettre en place pour une vulnérabilité Sql Injection de second ordre.

Après vous avez abordé cela, nous pouvons regarder le message d'erreur ici. Dans ce cas, le problème est que votre utilisateur Web n'a pas les autorisations CREATE appropriées. Vous devez corriger cela et cela devrait vous permettre de continuer. Vous voudrez probablement réserver un compte spécial pour cela que vous passez juste à ce moment, donc votre application ne fonctionne normalement pas dans un contexte qui permettrait ce genre d'action.

+0

Ceci n'est pas une page pour mes clients. Je suis le seul à avoir accès et cela provient d'une liste de noms très spécifique. –

+0

Et si votre machine est compromise? C'est une défense en profondeur. Aussi, c'est une bonne idée d'avoir l'habitude de ne jamais écrire de code non sécurisé. –

3

Je suppose que quel que soit le compte que vous utilisez pour vous connecter à Sql Server n'a pas les autorisations de CREATE DATABASE. Vous utilisez probablement la sécurité intégrée, qui utiliserait Network Service/ASP.NET pour se connecter à MSSQL. Vous devez créer un new connection string qui utilise l'authentification Sql avec sa (ou un autre administrateur système). Oh - et cela fonctionnerait localement car vous l'utilisez sous WebDev.exe de Visual Studio qui est exécuté avec votre compte d'utilisateur local - qui est probablement configuré comme un sysadmin dans MSSQL.

Questions connexes