Доступ запрещается при подключении базы данных - программирование

Доступ запрещается при подключении базы данных

Я использую выпуск разработчика SQL Server 2008. Я пытался прикрепить базу данных AdventureWorks2008.

Когда я попытался подключиться, я получил ошибку "access denied". Согласно журналу событий, он пришел из O/S:

Не удалось открыть файл: Не удалось открыть файл D:\ProjectData\AdventureWorks\AdventureWorksLT2008_Data.mdf для номера файла 0. Ошибка ОС: 5 (Доступ запрещен.).

Я подумал "проблема NTFS", но System (и I) изменили доступ к обоим файлам.

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

Я являюсь членом группы локальных администраторов на своей машине, и я участвую в роли sysadmins в экземпляре SQL Server.

Любая идея, почему я должен был войти в систему как sa?

4b9b3361

Ответ 1

Спасибо за все комментарии. Некоторые из вас помогли привести меня к ответу. Вот что я нашел:

Это была проблема разрешения NTFS, а не проблема SQL. Кроме того, он выглядит как похожий на ошибку (и он повторяется).

Проблема: Учетная запись, которую я использовал, полностью контролировала разрешения NTFS для файлов mdf и ldf. Тем не менее, он имел эти разрешения через членство в группе (у группы "Локальные администраторы" были разрешения, а моя учетная запись была членом локальных администраторов). (Я проверил разрешения)

Если я попытаюсь выполнить прикрепление, подключитесь к SQL Server как мне (где я в группе admins), он не справляется с проблемой NTFS.

Однако, если я предоставляю те же права доступа к файлу, что и локальная группа администраторов, к моей учетной записи домена, я могу без проблем подключиться.

(ах, и да, я проверил локальные группы на этом компьютере, и я подтвердил, что моя учетная запись домена действительно является членом локальной группы администраторов).

Итак, похоже, что ошибка возникает из-за того, что какой-либо код (либо в SQL Server, либо Management Studio) проверяет разрешения, которые имеет учетная запись пользователя, но он не заходит так далеко, чтобы проверять групповые разрешения, которые пользователь наследует учетную запись.

Это звучит странно для меня, но я могу повторять его снова и снова, поэтому я должен сделать вывод, что это ответ.

Обновление: Я сообщил об этом как об ошибке: https://connect.microsoft.com/SQLServer/feedback/details/539703/access-denied-attaching-a-database-when-permissions-are-inherited

Ответ 2

Запустите SQL Server Management Studio в качестве администратора. (щелкните правой кнопкой мыши- > запустить как администратор), который позаботился обо всех странностях в моем случае.

SQL SRV EXPRESS 2008 R2. Windows 7

Ответ 3

Я хотел бы добавить дополнительную информацию к ответам, которые были опубликованы.

Будьте осторожны при отсоединении базы данных, потому что пользователь Windows, с которым вы вошли в систему, становится единственным пользователем с разрешениями на файл .mdf! Исходные разрешения, внесенные в файл .mdf, который включал пользователя SQLServerMSSQLUser$<computer_name>$<instance_name> и учетную запись "Администраторы", были перезаписаны любым пользователем Windows, в котором вы вошли в систему (не пользователем SQL-сервера). Бум, все разрешения ушли именно так. Сделайте так, как сказали другие, и щелкните правой кнопкой мыши ваш файл .mdf и дважды проверьте разрешения.

Я столкнулся с этой проблемой, потому что я использовал SSMS для подключения к базе данных (неважно, какая учетная запись SQL-сервера) и отделил базу данных. После этого мой пользователь Windows был единственным, у которого были какие-либо разрешения для файла .mdf. Поэтому позже, когда я попытался подключить db, используя учетную запись sa, она выбросила ошибку "access denied".

Чтобы сохранить исходные разрешения в такте, вы должны отключить базу данных в автономном режиме, затем отсоединить, а затем присоединить в следующем порядке:

USE [master]
GO
-- kick all users out of the db
ALTER DATABASE mydb
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- Take the Database Offline
ALTER DATABASE mydb SET OFFLINE WITH
ROLLBACK IMMEDIATE
GO

-- detach the db
EXEC master.dbo.sp_detach_db @dbname = N'mydb'
GO

Ответ 4

Добавить разрешение в папку, в которой находится ваш файл .mdf.

Проверьте это имя: NT Service\MSSQLSERVER

И измените Location на имя вашего сервера.

Ответ 5

Эта проблема вызвана UAC (User Account Control), не так ли? Хотя ваша учетная запись пользователя является членом группы "Администраторы", UAC в Windows 7 не позволяет выполнять административные действия, если вы не запускаете программы "как администратор". Это не реальная ошибка в SQL Server или Management Studio или что-то еще. (Хотя он, возможно, знает проблему и просит вас получить повышенные разрешения вместо того, чтобы просто жаловаться на "ошибку 5".)

Ответ 6

База данных SQL2005 может быть подключена таким образом в Windows 7:

start menu >
 all program >
  Microsoft sql server 2005 >
   sql server management studio >
    right click >
     run as administrator >
      click ok

И после этого прикрепленная база данных успешно завершена.

Ответ 7

Когда вы входите в систему под именем sa (или любой учетной записи Sql Server), вы работаете как учетная запись службы SQL Server, когда вы вошли в систему как вы, у вас есть разрешения вашей учетной записи. По какой-то причине у вас нет соответствующего доступа к файлу, но учетная запись службы имеет.

Ответ 8

Запустите SQL Server Management Studio в качестве администратора. (щелкните правой кнопкой мыши- > запустить как администратор) работал у меня с Windows 7 - SQL Server 2008 R2

Ответ 9

Пользователь sa использует учетные записи NTFS SQLServerMSSQLUser$<computer_name>$<instance_name> и SQLServerSQLAgentUser$<computer_name>$<instance_name> для доступа к файлам базы данных. Вы можете попробовать добавить разрешения для одного или обоих этих пользователей.

Я не знаю, решает ли ваша проблема, поскольку вы говорите, что у вас нет проблем с пользователем sa, но я надеюсь, что это поможет.

Ответ 10

Со мной - Запуск в окне 8 - Нажмите кнопку SQL Server Manager Studio → Запустить с помощью администратора. → не прилагайте никаких проблем

Ответ 11

он может быть фиксирован легко, но радикально, просто перейдите в папку, в которой вы сохранили файл mdf. выберите файл- > Щелкните правой кнопкой мыши → щелкните по свойствам и предоставите полные разрешения для файла для входа в систему безопасности пользователя.

Ответ 12

Каждый раз, когда я сталкивался с этой проблемой, я пытался прикрепить базу данных, находящуюся в другом каталоге, из каталога базы данных по умолчанию, который настроен на сервере SQL.

Я бы очень рекомендовал, чтобы вместо того, чтобы подключаться к разрешениям на разные каталоги и учетные записи, вы просто перемещаете файл данных в каталог, который SQL-сервер ожидает найти.

Ответ 13

Я просто хотел добавить эту информацию.

http://www.mssqltips.com/sqlservertip/2528/database-attach-failure-in-sql-server-2008-r2/

Решение

Вы получаете эту ошибку, потому что два разных входа выполняли операции отсоединения и присоединения. Таким образом, файлы, если они были отсоединены, принадлежали первой учетной записи, но приложению не удалось, поскольку используемый вход не был владельцем файлов mdf и ldf.

Когда мы отделяем файлы базы данных, владелец становится лицом, выполнившим команду отсоединения, поэтому для решения проблемы нам необходимо изменить или добавить другой логин в качестве владельца файлов mdf и ldf.

Щелкните правой кнопкой мыши файл "filename.mdf" и выберите свойства, чтобы проверить разрешения файла mdf. Здесь мы видим, что только одна учетная запись имеет разрешение на файл "filename.mdf", поскольку это была учетная запись, которая использовалась для отсоединения базы данных.

Чтобы устранить эту проблему, нажмите кнопку "Добавить...", чтобы добавить другой логин или любой другой логин, необходимый для полного входа в систему. Вы должны сделать это для файла "ldf". После выполнения этой задачи нажмите кнопку "ОК". (Примечание для других версий ОС у вас может быть опция "Редактировать", нажмите эту кнопку сначала, а затем вы увидите параметр "Добавить...".)

Ответ 14

Я нашел это решение: щелкните правой кнопкой мыши папку, в которой вы храните свой файл .mdf, → нажмите "Свойства" → выберите вкладку "Безопасность", нажмите "Изменить..." и дайте ей полный контроль. Надеюсь, это поможет!

Ответ 15

Для чего стоит любой, кто имеет конкретную вариацию этой проблемы, которую я имел:

  • SQL Express 2008
  • Visual Studio 2010 Premium

В контекстном меню папки App_data я создал базу данных SQL Express для целей отладки. Строка соединения (используемая NHibernate) была следующей:

Server=.\SQLExpress;
AttachDbFilename=|DataDirectory|DebugDatabase.mdf;
Database=DebugDatabase;
Trusted_Connection=Yes;

Это дало мне ту же ошибку "Доступ запрещен" в файле базы данных. Я попытался предоставить различным пользователям полный доступ к папке и файлам, в какой-то момент даже "всем". Ничего не помогло, поэтому я снова удалил добавленные разрешения.

Что в конечном итоге решило его, было открыть Server Explorer в Visual Studio, затем подключиться к MDF и отделить его снова. После того, как я сделал это, мое веб-приложение могло легко получить доступ к базе данных.

PS. Кредиты идут в это сообщение в блоге Я обнаружил, что при поиске этой проблемы возникла ошибка, вызвав идею присоединения/отсоединения базы данных для решения проблемы.

Ответ 16

Я читал эту страницу, и там есть интересное предложение:

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

Конечно, они также имеют следующее:

Разрешения, предоставляемые пользователям и роли и являются специфичными для базы данных. Все разрешения суммируются с за исключением DENY. Отказано разрешение на уровне пользователя или на уровне ролей переопределяет то же самое разрешение предоставляется через другую роль членства, за исключением фиксированная роль сервера sysadmin. (A sysadmin сохраняет все разрешения, даже если роль, в которой они входят, имеет DENY.)

Итак, если вы являетесь администратором домена и в группе "sysadmin" SQL, мир должен быть вашим ракообразным.

Конечно, согласно Microsoft, вы должны быстро взглянуть на эти две страницы:
Ссылка на предварительные требования к базе данных

Ссылка на установку баз данных

Вы непослушны и пытаетесь прикрепить их вручную:) Серьезно, хотя у вас есть все предпосылки для базы данных AdventureWorks2008?
Я подозреваю, что это просто еще один случай необычности/края Microsoft, но я могу ошибаться.

Ответ 17

Это звучит как разрешения NTFS. Обычно это означает, что ваша учетная запись службы SQL Server имеет доступ только для чтения к файлу (обратите внимание, что SQL Server использует ту же учетную запись службы для доступа к файлам базы данных независимо от того, как вы входите в систему). Вы уверены, что не изменили разрешения на доступ к папке между входами в систему и сами вошли в систему как sa? Если вы отделитесь и попробуйте еще раз, у него все еще есть те же проблемы?

Ответ 18

У меня была такая же проблема при подключении базы данных. Это не проблема SQL, это проблема с учетной записью. Перейдите в панель управления/Настройки учетной записи пользователя/Уст. "Никогда не уведомлять". Наконец, перезагрузите компьютер, и это сработало для меня.

Ответ 19

Я приложил файл mdf, щелкнув правой кнопкой мыши базу данных и удалив файл журнала AdventureWorks2012_Data_log.ldf в мастере. Файл mdf был помещен в следующее расположение

    C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA

Этот метод помог мне решить проблему.

Ответ 20

Это на самом деле разрешения NTFS и странная ошибка в SQL Server. Я не уверен, что приведенный выше отчет об ошибке является точным или может ссылаться на дополнительную ошибку.

Чтобы решить эту проблему в Windows 7, я обычно запускал SQL Server Management Studio (не как администратор). Затем я попытался прикрепить файл MDF. В процессе я использовал пользовательский интерфейс, а не вставлял его в путь. Я заметил, что путь был отрезан от меня. Это связано с тем, что пользователь MS SQL Server (SQLServerMSSQLUser $machinename $SQLEXPRESS), который добавляет программное обеспечение для вас, не имеет прав доступа к папке (в этом случае папке в моих собственных пользовательских папках).

Вставка пути и результатов в вышеприведенной ошибке. Итак, я дал разрешениям пользователей MS SQL Server на чтение, начиная с первого каталога, из которого он был отказан (моя папка пользователя). Затем я немедленно отменил операцию распространения, потому что это может занять целую вечность и снова применить разрешения на доступ к следующей вложенной папке, и пусть это распространяется полностью.

Наконец, я дал пользователю MS SQL Server изменения для файлов .mdf и .ldf для db.

Теперь я могу подключиться к файлам базы данных.

Ответ 21

Я получил эту ошибку как sa. В моем случае безопасность не имела значения. Я добавил всех в полный контроль над файлами mdf и ldf, и прикрепление пошло нормально.

Ответ 22

Если вы запустите sql server 2012, вы можете получить эту ошибку, пытаясь прикрепить старую версию mdf файла. ex mdf файл с SQL Server 2008.

Ответ 23

Я решил проблему, просто переместив файл .mdf, который вы хотите подключить к общей папке, в моем случае я переместил его в папку users/public. Затем я прикрепляю его оттуда без каких-либо проблем. Надеюсь, это поможет.

Ответ 24

Для тех, кто не смог решить проблему с другими решениями здесь, для меня работало следующее исправление:

Перейдите в папку "DATA" в вашей установке SQL Server, щелкните правой кнопкой мыши, свойства, вкладку безопасности и добавьте полные права доступа для пользователя "NETWORK SERVICE".

http://decoding.wordpress.com/2008/08/25/sql-server-2005-expess-how-to-fix-error-3417/

(приведенная выше ссылка предназначена для SQL 2005, но для меня была установлена ​​установка SQL 2008 R2).

Дополнительная информация: эта проблема возникла после замены дополнительного жесткого диска (на котором была установлена ​​SQL-установка). Я скопировал все файлы и восстановил оригинальную букву диска на новый жесткий диск. Однако разрешения безопасности не были скопированы. Я думаю, что в следующий раз я буду использовать лучший способ копирования данных.

Ответ 25

В моем случае проблема была решена следующим образом:

USE [master]
GO
CREATE DATABASE [AdventureWorks2008R2] ON
( FILENAME = 'C:\Program Files\Microsfot SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\AdventureWors2008R2_Data.mdf')
FOR ATTACH_REBUILD_LOG

Ответ 26

Скопировать базу данных в другую папку и подключить или войти в SQLServer с помощью "Аутентификация Windows"

enter image description here

Ответ 27

У меня была такая же проблема при повторной установке базы данных после ее отсоединения и перемещения файлов ldf и mdf с диска C на F.

Чтобы исправить это, я должен был добавить основной принцип OWNER RIGHTS в оба файла и дал ему полный контроль над ними на вкладке "Безопасность" диалогового окна "Свойства".

Ответ 28

Я переместил базу данных mdf из папки данных по умолчанию в папку asp.net app_data и столкнулся с этой проблемой, пытаясь установить базу данных обратно в сети.

Я сравнил параметры безопасности других файловых баз данных в исходном местоположении с перемещенными файлами и заметил, что MSSQL $SQLEXPRESS не был назначен разрешениям на файлы в их новом местоположении. Я добавил полный контроль над "NT SERVICE\MSSQL $SQLEXPRESS" (должен включать эту службу NT), и он был добавлен просто отлично.

Похоже, что исходная папка данных имеет эти разрешения и файлы наследуют ее. Перемещайте файлы и разрывы наследования, конечно.

Я проверил другой файл mdf проекта, который я создал непосредственно в его папке app_data. он не имеет разрешений MSSQL $SQLEXPRESS. Хммм. Интересно, почему SQL Express любит одно, а не другое?

Ответ 29

Я боролся с SSMS (2016), чтобы прикрепить базу данных AdventureWorks2012. Но имел успех с этим кодом, взятым из статьи CodeProject Mohammad Elsheimy:

CREATE DATABASE AdventureWorks2012
    ON PRIMARY (FILENAME='D:\Dev\SQL Server\AdventureWorks2012.mdf')
    FOR ATTACH;

Ответ 30

введите описание изображения здесь

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH
GO

измените на ДЛЯ ATTACH → ДЛЯ ATTACH_FORCE_REBUILD_LOG

USE [master]
GO
CREATE DATABASE [DataBasename] ON 
( FILENAME = N'C:\data\DataBasename.mdf' )
 FOR ATTACH_FORCE_REBUILD_LOG
GO