SQL Server «Не удалось найти хранимую процедуру» без имени схемы - PullRequest
1 голос
/ 25 октября 2011

SQL Server 2005/2008, дБ = пользователь = схема = владелец = 'Джон', ASP.net 2.0.50727, VB, IIS7

Я перемещаю сайт с одного сервера на другой. Этот фрагмент кода хорошо работает на старом сервере с SQL Server 2005.

    Dim sqlCmdVehicle As SqlCommand = New System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)
    Dim dtVehicle As New DataTable

    With sqlCmdVehicle
        .Parameters.AddWithValue("FullStockNo", "N102010")
        .CommandType = CommandType.StoredProcedure
    End With

    sqlConn.Open()
    sqlAdapter.SelectCommand = sqlCmdVehicle
    sqlAdapter.Fill(dtVehicle)

БД резервируется и успешно восстанавливается на новом сервере. Когда я пытаюсь запустить новый SQL Server 2008, я получаю сообщение об ошибке:

Не удалось найти хранимую процедуру 'SP_Name'. указывая на последнюю строку.

Я могу видеть процедуры с «MS SQL Management Studio» не как dbo.SP_Name, а как John.SP_Name

Когда я меняюсь

System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)

в

System.Data.SqlClient.SqlCommand("John.SP_Name", sqlConn)

все работает хорошо, но то же самое со всеми другими процедурами и множеством подобных мест в коде: (

Я получил http://msdn.microsoft.com/en-us/library/ms189915.aspx,, но схема вызывающего абонента по умолчанию верна. Опять же, все хорошо работает на старой коробке.

Что я должен исправить в SQL, чтобы разрешить запуск SP без явно упомянутого имени пользователя / схемы?

Спасибо.

======================================

К сожалению, я не нашел хорошего решения. Я выбрал поиск и замену SP_Name на John.SP_Name для всего проекта. Спасибо всем участникам.

Ответы [ 6 ]

2 голосов
/ 25 октября 2011

Я не уверен на 100%, но у вас, вероятно, есть подключение к базе данных с использованием sql username / pw, а затем пользователь с именем пользователя "john".

В этом случае вашей схемой по умолчанию является "john", какну, и вам напрямую нужно использовать dbo.SP_name для правильного доступа к вашей процедуре.

Что также работает, так это для настройки схемы по умолчанию для пользователя john для пользовательской базы данных на "dbo".Вы можете сделать это в меню свойств пользователя.

Sitenote: не использовать sp_.Если вы создаете свои собственные процедуры, используйте, например, proc_.Использование sp_ всегда заставляет SQL-сервер сначала просматривать базу данных master.Это замедляет производительность.

1 голос
/ 23 апреля 2013

В SQL Server> база данных> Имя вашей базы данных> Безопасность> Схемы

Выберите Схемы dbo> Свойства> Выбрать разрешение>

В этом разделе «Пользователи и роли»

Добавьте свой логин. Имя пользователя и разрешение для имени пользователя дают проверку при выполнении.

1 голос
/ 25 октября 2011

Вы будете точно знать, что происходит, если вы запустите SQL Profiler и просмотрите данные трассировки. Вы увидите, каков точный вызов для базы данных и что происходит.

Я знаю, что вы уже упоминали об этом, но я бы дважды проверил, какой пользователь использует ваш код в качестве схемы по умолчанию. Если схема не указана, SQL Server будет сначала использовать схему по умолчанию для пользователя , а если он не сможет найти этот объект БД, то попробует dbo схема , и если это не сработает, вы увидите ту ошибку, которую видите.

0 голосов
/ 11 сентября 2014

Сегодня мы обнаружили, что, если вы измените разрешения своих пользователей, чтобы они были системными администраторами на SQL Server, даже если вы указали схему по умолчанию для своего пользователя в базе данных, схема по умолчанию игнорируется, если вы пытаетесь запустить сохраненный Процедура без указания имени схемы, он будет думать, что хранимая процедура находится в схеме dbo! Когда вы удаляете права sysadmin у входящего в систему пользователя, он будет запускать хранимую процедуру, используя схему по умолчанию, настроенную для этой базы данных для пользователя, если вы не укажете имя схемы в своей команде EXEC.

0 голосов
/ 28 мая 2012

К сожалению, я не нашел хорошего решения.Я выбрал поиск и замену SP_Name на John.SP_Name для всего проекта.Спасибо всем участникам.

0 голосов
/ 25 октября 2011

Схема по умолчанию для SQL Server 2008 - «dbo».Вот почему он пытается нажать dbo.SP_Name

Вам необходимо установить схему по умолчанию для пользователя.См. Следующий вопрос: Можете ли вы установить схему по умолчанию для SQL 2008 Query

...