Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Пробую сделать запись отладочной информации из хранимой процедуры в файл. Нужно чтобы процедура выводила текст не в окно сообщений Management Studio, а в текстовый файл. Т.е в тех местах кода, где имеется оператор print нужна некая функция print_to_file.

Делаю так:

CREATE PROCEDURE [dbo].[print_to_file] @FileName sysname, @s varchar(4000) 
AS
BEGIN

declare @FS int, @OLEResult int, @FileID int, @err varchar(255)

set @err=''

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
if @OLEResult <> 0 BEGIN
  set @err='Scripting.FileSystemObject'
  GOTO ErrHandler
END

EXECUTE @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUTPUT, @FileName, 8, 0 -- 8- forappending
IF @OLEResult <> 0 BEGIN
  set @err='OpenTextFile'
  GOTO ErrHandler
END

set @s=@s+char(0)
EXECUTE @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @s
IF @OLEResult <> 0 BEGIN
  set @err='WriteLine '+@s
  GOTO ErrHandler
END

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS

return 0

ErrHandler:
  raiserror(@err,16,1)

END

Делаю вызов
exec dbo.print_to_file 'D:\reports\2010.11\09.txt', 'текст!'
и получаю ошибку 'OpenTextFile', хотя указанный файл существует.

Помогите разобраться, в чем дело.
Буду признателен, если предложите другой способ печати в файл.
Если возможно - с созданием файла, если нет - вывод в существующий файл.
18 ноя 10, 16:54    [9803118]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Важное дополнение:

Перед вызовом процедуры печати делаю следующее:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

Но ошибка открытия файла все-равно происходит.
18 ноя 10, 16:56    [9803134]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
SergeV
П
Делаю вызов
exec dbo.print_to_file 'D:\reports\2010.11\09.txt', 'текст!'
и получаю ошибку 'OpenTextFile', хотя указанный файл существует.

И где текст оригинальной ошибки ?
Вы же нигде не получаете ее.
18 ноя 10, 16:58    [9803148]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Как ни странно, код оригинальной ошибки - 0
если пишу:
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
if @OLEResult <> 0 BEGIN
  	print 'Err: ' + str(@@ERROR)--set @err='Scripting.FileSystemObject'
	print 'Mes: ' + ERROR_MESSAGE()
  GOTO ErrHandler
END

то получаю 0 и пустое сообщение.
18 ноя 10, 17:12    [9803263]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это потому, что ошибки OLE объектов получают через процедуру sp_OAGetErrorInfo
18 ноя 10, 17:15    [9803307]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Все-равно получаю о.

После
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUTPUT, @FileName, 8, 0 -- 8- forappending
IF @OLEResult <> 0 BEGIN
	--set @err='OpenTextFile'
	EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT
  	print 'Err2: ' + str(@hr) 
	print 'Src2: ' + @source
	print 'Mes2: ' + @description
	GOTO ErrHandler
END

Результат:
Err2: 0

Сообщение пустое.
18 ноя 10, 17:27    [9803399]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
sp_OAGetErrorInfo NULL - и для какого объекта вы собираетесь получить ошибку ? Для объекта NULL ?
18 ноя 10, 17:28    [9803417]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
В хелпе написано, что
"Если задается NULL, то возвращаются сведения об ошибке для всего пакета."

Хотя и
	EXEC @hr = sp_OAGetErrorInfo @OLEResult/*NULL*/, @source OUT, @description OUT
тоже дает 0.
18 ноя 10, 17:31    [9803436]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Упрощённый вариант:
CREATE PROCEDURE [dbo].[spSaveToFile] (
	 @@File		SysName
	,@@Data		NVarChar(max)
	,@@Encoding	SysName	= 'utf-8'
) WITH EXECUTE AS OWNER AS BEGIN
	DECLARE	 @OLEStream	Int
		,@Code		Int
		,@Method	SysName
		,@Source	SysName
		,@Descript	NVarChar(4000)
	EXEC @Code = sys.sp_OACreate 'ADODB.Stream' ,@OLEStream OUT
	IF (@Code != 0)
		SELECT	 @Method	= 'Scripting.Stream'
			,@Source	= 'sp_OACreate'
			,@Descript	= 'Ошибка создания OLE объекта'
	ELSE BEGIN
		SET @Method = 'Open';		EXEC @Code = sys.sp_OAMethod		@OLEStream ,@Method			IF (@Code != 0) GOTO Error;
		SET @Method = 'CharSet';	EXEC @Code = sys.sp_OASetProperty	@OLEStream ,@Method, @@Encoding		IF (@Code != 0) GOTO Error;
		SET @Method = 'WriteText';	EXEC @Code = sys.sp_OAMethod		@OLEStream ,@Method ,NULL ,@@Data	IF (@Code != 0) GOTO Error;
		SET @Method = 'SaveToFile';	EXEC @Code = sys.sp_OAMethod		@OLEStream, @Method, NULL, @@File, 2	IF (@Code != 0) GOTO Error;
		SET @Method = 'Close';		EXEC @Code = sys.sp_OAMethod		@OLEStream, @Method			IF (@Code != 0) GOTO Error;
		SET @Method = NULL; GOTO Destroy;
Error:						EXEC @Code = sys.sp_OAGetErrorInfo	@OLEStream ,@Source OUT ,@Descript OUT
Destroy:					EXEC @Code = sys.sp_OADestroy		@OLEStream
	END
	-- Вывод ошибок
	IF (@Method IS NOT NULL) BEGIN
		RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@Method,@Source,@Descript)
		RETURN	@@Error
	END
END
GO
18 ноя 10, 17:59    [9803638]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Mnior,

Попробовал Ваш способ. Уперся в отсутствие разрешений:

Запрещено разрешение "EXECUTE" на объект "sp_OACreate" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OASetProperty" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OADestroy" базы данных "mssqlsystemresource", схемы "sys".


Пока не понимаю как их предоставить. Нужно что-то вроде этого ?

USE mssqlsystemresource; 
GRANT EXECUTE ON OBJECT::sys.sp_OACreate TO my_printer_role;
19 ноя 10, 11:43    [9806806]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
SergeV
Mnior,

Попробовал Ваш способ. Уперся в отсутствие разрешений:

Запрещено разрешение "EXECUTE" на объект "sp_OACreate" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OASetProperty" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OAMethod" базы данных "mssqlsystemresource", схемы "sys".
Запрещено разрешение "EXECUTE" на объект "sp_OADestroy" базы данных "mssqlsystemresource", схемы "sys".


Пока не понимаю как их предоставить. Нужно что-то вроде этого ?


А как же вы до этого выполняли
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
19 ноя 10, 11:45    [9806825]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Glory,

Раньше это сообщение об ошибке не появлялось, возвращался 0.
19 ноя 10, 11:46    [9806835]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
SergeV
Glory,

Раньше это сообщение об ошибке не появлялось, возвращался 0.

Вы хотите сказать, что команда
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
и команда
EXECUTE @OLEResult = sys.sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT

у вас работают по разному ?
19 ноя 10, 11:51    [9806884]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Я не знаю, что происходит, потому и спрашиваю.
19 ноя 10, 12:15    [9807139]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
SergeV
Я не знаю, что происходит, потому и спрашиваю.

А на вопросы вы умеете отвечать ?
19 ноя 10, 12:17    [9807153]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Команды
EXEC @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
и
EXEC @OLEResult = sys.sp_OACreate 'ADODB.Stream' ,@OLEStream OUT
выполняются по-разному.
19 ноя 10, 12:50    [9807459]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Glory
Member

Откуда:
Сообщений: 104760
А
EXEC @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
и
EXEC @OLEResult = sys.sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT
19 ноя 10, 13:00    [9807530]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
одинаково
19 ноя 10, 13:08    [9807607]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SergeV
Mnior
WITH EXECUTE AS OWNER


Попробовал Ваш способ. Уперся в отсутствие разрешений:

Запрещено разрешение "EXECUTE" на объект "sp_OACreate" базы данных "mssqlsystemresource", схемы "sys".

Пока не понимаю как их предоставить. Нужно что-то вроде этого ?
Это зависит от стратегии прав доступа. Если вы хотите чтоб не зависило от того кто запускает, то
WITH EXECUTE AS OWNER
, т.е. от имени владельца процедуры, или
WITH EXECUTE AS 'user_name'
, т.е. от имени user_name.


Иначе, т.е. по правам того кто вызывает, тогда так
WITH EXECUTE AS CALLER
точнее опустить (обо CALLER итак по умолчанию).

В вашем случае владелец процедуры (dbo, т.е. владелец базы) не имеет нужных прав. А т.к. вы работаете от sa (или админа), то у вас (CALLER) права есть, но их-то нет (не будет) у тех кто будет пользоваться это процедурой. Поэтому вы должны выбрать стратегию WITH EXECUTE AS OWNER/'user_name'.
А для этого вам ещё нужно учитать TRUSTWORTHY.
Подробнее.
19 ноя 10, 15:37    [9808975]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Mnior,

Спасибо
19 ноя 10, 18:31    [9810472]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
SergeV
Member

Откуда:
Сообщений: 144
Mnior,

Может я не прав, но кажется здесь проще чем TRUSTWORTHY. Процедура будет запускаться только от моего имени. Я работаю не как админ, а под своей доменной учетной записью.
Сейчас скомпилировал процедуру с опцией
WITH EXECUTE AS CALLER
.
После этого ошибка изменилась:
Ошибка при выполнении метода "SaveToFile" в "ADODB.Stream": Не удается записать файл.

Это связано уже с моими доменными разрешениями на каталоги сервера ? Хотя так не должно быть, т.к обычную запись файла в проводнике в эту папку я делаю.
Не понимаю...(
22 ноя 10, 14:58    [9819207]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SergeV
Я работаю не как админ, а под своей доменной учетной записью.
Груша не фрукт, т.к. она жёлтая.
sp_OA* требуют членство роли sysadmin.

Что-то вы не договариваете.
23 ноя 10, 11:28    [9823819]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Печать в текстовый файл  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
В базе master разрешение надо дать на выполнение(Execute) пользователю guest.
Может кому то поможет.
5 апр 12, 16:32    [12371518]     Ответить | Цитировать Сообщить модератору
 Re: Печать в текстовый файл  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Александр52, медвежья услуга?!
В стиле - пропихни кубик в круглое отверстие.
7 апр 12, 18:17    [12380871]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Печать в текстовый файл  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Mnior, что это за могучее шаманство и где про него почитать ?

[dbo].[spSaveToFile]
29 апр 13, 13:51    [14244000]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить