Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
Здравствуйте, Все!

Имеется задача: сделать на сервере копию уже существующей БД с другим именем. На первый взгляд тривиальна и, действительно, закодировать сложностей не было. Мною был выбран следующий путь:
1) отсоединяем существующую БД
2) копируем файлы в той же папке с другими именами
3) присоединяем обе базы, каждый со своими файлами

Проблема возникла на шаге №2. Т.е. вот такая инструкция
DECLARE @cmd varchar(1000)
SELECT @cmd = N'copy /y C:\Temp\AccessIsDeniedTestDB.mdf C:\Temp\AccessIsDeniedTestDB_Copy.mdf'
EXEC xp_cmdshell @cmd--, no_output
не хочет копировать файлы на локальных ресурсах с таким аутпутом:
Access is denied.
        0 file(s) copied.
Много вопросов на похожую тему можно нагуглить, но почти у всех проблема в том, что копируют файлы на\с сетевых ресурсов по UNC путям и забывают, что надо дать аккаунту, от которого стартует sql server соответствующие права. Но у меня копирование только на локали. Мой sql server стартован от имени Local System (знаю, что это нехороший тон, но так надо).

Вопрос: Почему Local System не может копировать файлы на локальной системе? Я думал на локали он имеет супер-пупер права.

Но тут есть следующие комментарии:
- Другие файлы (не файлы копируемой БД) копируются без проблем
- Если сменить аккаунт sql server на другой, например доменный типа domain\FirstName_LastName, у которого тоже много прав на сервере, то всё работает. Т.е. дело не в t-sql скрипте - он правильный.
- Внизу приложен скрипт для воспроизведения описанной проблемы.
- Версия: Microsoft SQL Server 2005 - 9.00.3282.00 (Intel X86) Aug 5 2008 01:01:05 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
- Но воспроизводится также на 2005DE и 2008DE. Также пробовал на разных серверах (в смысле железных).
USE [master]
GO

-- Удаляем тестовые БД
IF EXISTS (SELECT 1 FROM sys.databases WHERE [name] = N'AccessIsDeniedTestDB')
BEGIN
  ALTER DATABASE [AccessIsDeniedTestDB] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE;
  DROP DATABASE [AccessIsDeniedTestDB];
END
GO

IF EXISTS (SELECT 1 FROM sys.databases WHERE [name] = N'AccessIsDeniedTestDB_Copy')
BEGIN
  ALTER DATABASE [AccessIsDeniedTestDB_Copy] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE;
  DROP DATABASE [AccessIsDeniedTestDB_Copy];
END
GO

-- Создаём тестовую БД. Файлы кладутся в C;\Temp
CREATE DATABASE [AccessIsDeniedTestDB] ON PRIMARY 
( NAME = N'AccessIsDeniedTestDB',
  FILENAME = N'C:\Temp\AccessIsDeniedTestDB.mdf')
 LOG ON 
( NAME = N'AccessIsDeniedTestDB_log',
  FILENAME = N'C:\Temp\AccessIsDeniedTestDB_log.ldf')
GO


-- Отсоединяем только что созданную БД
EXEC master.dbo.sp_detach_db
 @dbname = N'AccessIsDeniedTestDB',
 @keepfulltextindexfile=N'true';
GO

-- Пытаемся копировать файлы отсоединённой базы. Копируем в ту же папку. Никаких сетевых ресурсов. Всё на одном сервере.
DECLARE @cmd varchar(1000)

SELECT @cmd = N'copy /y C:\Temp\AccessIsDeniedTestDB.mdf C:\Temp\AccessIsDeniedTestDB_Copy.mdf'
EXEC xp_cmdshell @cmd--, no_output

SELECT @cmd = N'copy /y C:\Temp\AccessIsDeniedTestDB_log.ldf C:\Temp\AccessIsDeniedTestDB_log_Copy.ldf'
EXEC xp_cmdshell @cmd--, no_output
GO

-- Присоединяем оригинальную БД
CREATE DATABASE [AccessIsDeniedTestDB] ON 
( FILENAME = N'C:\Temp\AccessIsDeniedTestDB.mdf' ),
( FILENAME = N'C:\Temp\AccessIsDeniedTestDB_log.ldf' )
 FOR ATTACH
GO

-- Тут бы хотелось присоеденить копию, но выше не скопировались файлы, поэтому падает
CREATE DATABASE [AccessIsDeniedTestDB_Copy] ON 
( FILENAME = N'C:\Temp\AccessIsDeniedTestDB_Copy.mdf' ),
( FILENAME = N'C:\Temp\AccessIsDeniedTestDB_log_Copy.ldf' )
 FOR ATTACH
GO

В чём проблема?
Заранее спасибо за ответ и за разъяснения (если таковые будут).
12 авг 09, 19:35    [7530172]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
тынц
раздел Detaching and Attaching a Database
12 авг 09, 20:15    [7530281]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
A Backup/Restore не пробовали? Оно проще получится.
Водку? Водку - буду!
12 авг 09, 21:07    [7530447]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
invm
тынц
раздел Detaching and Attaching a Database

За тынц спасибо, но можно ли точнее тынцнуть. Приведите тут цитату из тынц, которая бы подтверждала, что шаг №2 выше (копирование файлов) должен завершаться с ошибкой Access id denied при описанных выше условиях. По ссылкам рядом с Вашим тынц я нашёл такое:

Procedure
To copy a database using detach and attach.

1. Detach the database by using the sp_detach_db stored procedure...

2. In a Windows Explorer or Windows Command Prompt window, move the detached database file or files and log file or files to the new location.
...<skiped>...

3. Attach the copied files using the CREATE DATABASE Transact-SQL statement with a FOR ATTACH...<skiped>...

В примере ниже этого текста пункт два звучит так:

2. Using the method of your choice, copy the database files (AdventureWorks_Data.mdf and AdventureWorks_log) to: C:\MySQLServer\AdventureWorks_Data.mdf and C:\MySQLServer\AdventureWorks_Log.ldf, respectively.

Метод, котрый я choose - это xp_cmdshell 'copy...', а не Windows Explorer or Windows Command Prompt, посредством которых действительно всё работает так, как написано в примере. Доступ к файлам есть и они копируются.

Вопрос: почему нельзя скопирвать эти же файлы методом exec xp_cmdshell 'copy...'?
13 авг 09, 11:29    [7532096]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
Под каким аккаунтом запускается ваш скрипт?
13 авг 09, 11:31    [7532111]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
GlebZ
A Backup/Restore не пробовали? Оно проще получится.

Это тоже вариант, но менее предпочтительный. Если база сотни Гиг, то критично по времени работы такого скрипта и месту на дисках. Хотя у меня это и не так, и можно было бы пойти таким путём, всё же вопрос с detach\copy\attach остаётся из принципиальных соображений. Просто непонятно почему Access is denied. Надеюсь, что это временно :).
13 авг 09, 11:34    [7532146]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
1234567
Под каким аккаунтом запускается ваш скрипт?

Аккаунт запускающий скрипт - это доменный аккаунт, имеющий админские права на сервере.
13 авг 09, 11:36    [7532161]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
Он точно имеет права на запись в папке?
13 авг 09, 11:36    [7532170]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
1234567
Он точно имеет права на запись в папке?

Прводником копирует без проблем.
13 авг 09, 11:37    [7532179]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
igor_ku
1234567
Он точно имеет права на запись в папке?

Прводником копирует без проблем.


Можете посмотреть, кому даны права на файлы базы и какие? И всё-таки, кому даны права на папку и какие.
13 авг 09, 11:39    [7532198]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
Тот большой выше скирпт вроде рабочий. У Вас он отрабатывает или это только у меня проблема? (Ну только про Local System надо не забыть для воспроизведения ошибки?)
13 авг 09, 11:42    [7532214]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
igor_ku

За тынц спасибо, но можно ли точнее тынцнуть. Приведите тут цитату из тынц, которая бы подтверждала, что шаг №2 выше (копирование файлов) должен завершаться с ошибкой Access id denied при описанных выше условиях.

OperationConnecting account can be impersonatedFiles permissions are granted to
DetachYesOnly the account performing the operation. Additional accounts can be added by a operating system administrator if they are needed after the database is detached.

Наверняка под Windows authentication работаете? Проверьте разрешения на файлы.
13 авг 09, 11:43    [7532223]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
Glory
Member

Откуда:
Сообщений: 104751
Остался неясными пару аспектов
- кем вы залогинены к серверу в SMS ?
- произошло ли действительное освобождение физических файлов после sp_detach_db ?
13 авг 09, 11:44    [7532227]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
1234567
igor_ku
1234567
Он точно имеет права на запись в папке?

Прводником копирует без проблем.


Можете посмотреть, кому даны права на файлы базы и какие? И всё-таки, кому даны права на папку и какие.

SYSTEM - Full Control и далее ниже галочки по списку
Administartors - Full Control и далее ниже галочки по списку
Аккаунт от которого запускается скрипт - Full Control и далее ниже галочки по списку, хотя он в Administrators уже есть
13 авг 09, 11:46    [7532250]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
igor_ku
Тот большой выше скирпт вроде рабочий. У Вас он отрабатывает или это только у меня проблема? (Ну только про Local System надо не забыть для воспроизведения ошибки?)


Если скрипт запускается под именем входа SQL Server, то файлы копируются.

Если скрипт запускается под именем входа Windows, то Access denied.
13 авг 09, 11:52    [7532293]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
Glory
Остался неясными пару аспектов
- кем вы залогинены к серверу в SMS ?
- произошло ли действительное освобождение физических файлов после sp_detach_db ?


1. Выше я уже упоминал:
igor_ku
Аккаунт запускающий скрипт - это доменный аккаунт, имеющий админские права на сервере.

2. Если бы не произошло освобождения, то было бы такая ошибка: The process cannot access the file because it is being used by another process.
13 авг 09, 11:56    [7532322]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
Думается мне, что прав не хватает, когда запускается xp_cmdshell. Наверняка ведь работает от имени учетной записи Windows для SQL Server, а права на файлы базы после аттача даются только вашему виндовому юзеру...
13 авг 09, 11:57    [7532334]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
igor_ku
Member

Откуда:
Сообщений: 129
1234567
igor_ku
Тот большой выше скирпт вроде рабочий. У Вас он отрабатывает или это только у меня проблема? (Ну только про Local System надо не забыть для воспроизведения ошибки?)

Если скрипт запускается под именем входа SQL Server, то файлы копируются.

Если скрипт запускается под именем входа Windows, то Access denied.

Да, только что это проверил и это так. Видимо надо как-то вкурить вразу от invm:
invm
[quot igor_ku]
OperationConnecting account can be impersonatedFiles permissions are granted to
DetachYesOnly the account performing the operation. Additional accounts can be added by a operating system administrator if they are needed after the database is detached.

Наверняка под Windows authentication работаете? Проверьте разрешения на файлы.

Пока не прочувствовал, почему это так.
Думаю топик можно закрыть.
Всем СПАСИБО!
13 авг 09, 12:00    [7532355]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
1234567
Member

Откуда:
Сообщений: 704
1234567
Думается мне, что прав не хватает, когда запускается xp_cmdshell. Наверняка ведь работает от имени учетной записи Windows для SQL Server, а права на файлы базы после аттача даются только вашему виндовому юзеру...


Пардон, после detach
13 авг 09, 12:02    [7532376]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: xp_cmdshell - copy - Acces is denied  [new]
забыт пароль
Guest
А как средствами сиквела их (права на файлы после детача) поменять потом? Это возможно?
22 дек 11, 18:46    [11811482]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
забыт пароль,

xp_cmdshell + cacls
22 дек 11, 19:13    [11811585]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
забыт пароль
Guest
Спасибо. Возник следующий вопрос - надо дать права всем пользователям на файл в ХП.
Как узнать язык ОС сервера (либо есть какой другой путь), чтобы определить для запуска cacls как эта группа пользователей называется - Все или everyone?
23 дек 11, 14:37    [11815425]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
забыт пароль,

1. Это не задача для SQL Server
2. У Everyone фиксированный SID -- Well-known security identifiers in Windows operating systems
23 дек 11, 14:52    [11815574]     Ответить | Цитировать Сообщить модератору
 Re: xp_cmdshell - copy - Acces is denied  [new]
забыт пароль
Guest
invm
забыт пароль,

2. У Everyone фиксированный SID -- Well-known security identifiers in Windows operating systems

Еще раз спасибо, использование SID-а - это выход.
23 дек 11, 18:29    [11817536]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить