#c# #.net #sql-server
#c# #.net #sql-сервер
Вопрос:
Почему drop user a_2
команда не работает, когда я пытаюсь использовать ее в C #, в то время как когда я пробовал ее в SQL Server Management Studio, она работает там !!???
Это код, который я использовал, когда создавал пользователя и давал ему разрешение:
use DataBaseName;
create login a_2 with password='Aa123';
create user a_2 for login a_2;
grant insert to a_2;
..........
Используемая строка подключения :
Data Source=TheServerName;Integrated Security=True;database=master
Примечание:
Я попытался удалить базу данных с C #, и она отлично работает без каких-либо проблем, но когда я использую ее для удаления пользователя, проблема возникает здесь!!!
Возникает это исключение
Исключение: Невозможно удалить пользователя ‘a_2’, потому что он не существует или у вас нет разрешения.
Комментарии:
1. Теперь она работает, после того как я сменил «удалить пользователя» на «удалить логин» :)….. Большое спасибо, ребята;)
Ответ №1:
Я полагаю, ваша проблема в том, что «у вас нет разрешения«. Ваше приложение запущено от имени другого пользователя. Вы можете решить эту проблему, либо предоставив пользователю приложения по умолчанию необходимые разрешения для базы данных (не очень хорошая идея), либо создав специального пользователя в базе данных для вашего приложения и запустив приложение от имени этого пользователя.
Имейте в виду, что предоставление вашему приложению (или любому пользователю, если на то пошло) разрешений на удаление пользователей может быть очень рискованным, если кто-то выяснит, как взломать ваше приложение. И вы на самом деле не включаете возможность удаления базы данных в свое приложение, не так ли? Подумайте об этом. Вместо создания пользователей в базе данных, рассмотрите возможность создания таблицы Users только для вашего приложения. Тогда у ваших пользователей не будет таких обширных прав на вашу реальную базу данных.
Комментарии:
1. Я запускаю VS в режиме администратора, и когда я тестирую и создаю базу данных и пользователя, которого я создал, используя ту же учетную запись пользователя… Итак, я не думаю, что проблема здесь в олицетворении … поскольку я также запускаю VS в admin!! Это сработало!!!
2. В Sql Server есть концепция логинов и пользователей . Логины — это учетные записи / привязки, используемые для доступа к самому физическому серверу. Вы можете использовать учетные записи Windows / Домена в качестве логинов, или вы можете использовать выделенные логины Sql Server. В вашем приложении C # используется интегрированная защита, что означает, что вы входите в Sql Server с той же учетной записью пользователя, с которой вы используете VS as. Я бы проверил, что пользователь Sql, к которому привязан ваш логин Sql (учетная запись Windows), имеет разрешения, необходимые для удаления пользователя для соответствующей базы данных.
3. У меня есть разрешение на удаление пользователя и базы данных в управлении sql… и я тестирую это там… но, как я уже сказал, в коде c # это не работает… Я не могу удалить пользователя там…
Ответ №2:
DROP USER
потребуется use DataBaseName
;
Или другая строка подключения
Data Source=TheServerName;Integrated Security=True;database=DataBaseName
То есть DROP USER
имеет смысл только в контексте вашей базы данных. Когда вы запускаете ее позже, вы находитесь в контексте master = fail .
Комментарии:
1. Как насчет
select DB_NAME
? Та же ошибка? Те же учетные данные для базы данных?2. Почему я должен использовать select DB_NAME?? Для чего это нужно?? мне нужно удалить пользователя… Я вас не понимаю … не могли бы вы объяснить мне это подробнее, если можно…
3. Извините, ExecuteScalar видит, в какой базе данных вы находитесь. Дело в том, что CREATE USER и DROP USER имеют одинаковые права: значит, что-то не так с вашим подключением, контекстом или учетными данными.
4. Теперь она работает, после того как я сменил «удалить пользователя» на «удалить логин» :)….. Большое спасибо, ребята;)
5. В этом случае у вас все еще есть пользователь в базе данных, и вы находитесь в главной базе данных … и вы не последовали моим предложениям выше…