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

Откуда:
Сообщений: 141
SQL server 2008


есть скрипт, который должен вытаскивать курсы валют! тема изъезженная, не новая, у всех свои траблы, у меня вот свой :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[KURS_GetKursValuteTable] @Bdate datetime, @Edate datetime, @TypeValute varchar(3)
AS
begin
	set dateformat dmy
	
	DECLARE @xmlString VARCHAR(8000)
	DECLARE @date datetime, @prevDate datetime
	DECLARE @h int
	DECLARE @flag bit
	DECLARE @url varchar(255)
	DECLARE @Valute varchar(10)
	SELECT @flag = 0

	If object_ID('tempdb..#tempKURS') Is not Null drop table #tempKURS
	CREATE table #tempKURS ([Date] smalldatetime, Rate money, CurrencyId int)
	
	set @Valute = case 
		when @TypeValute = 'USD' then 'R01235' 
		when @TypeValute = 'EUR' then 'R01239' 
		else '' end

	WHILE @flag = 0
	BEGIN
		SELECT @url = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='+
			Convert(char(10), @Bdate, 103) +'&date_req2='+
			Convert(char(10), @Edate, 103)+'&VAL_NM_RQ=' + @Valute


		exec KURS_LoadXMLFromFile @url, @xmlString output
		exec sp_xml_preparedocument  @h output, @xmlString

		INSERT INTO #tempKURS ([Date], [Rate], CurrencyId)
		select 
			convert(smalldatetime, [Date], 104), 
			Convert(money, replace(Value, ',', '.')) 'Value',
			100
		from OpenXML (@h, '//Record', 0)
		with 
		(
		[Date] char(10) '@Date',
		Nominal int './Nominal',
		Value varchar(10) './Value'
		)
		SET @flag = 1
		exec sp_xml_removedocument @h
	END

	select * from #tempKURS
	drop table #tempKURS
end


+ кнему доп. процедура

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  PROCEDURE [dbo].[KURS_LoadXMLFromFile]
(
	@tcFileName		VARCHAR(255),
	@tcXMLString	VARCHAR(8000) OUTPUT
) AS
BEGIN
	-- Scratch variables used in the script
	DECLARE @retVal INT
	DECLARE @oXML INT
	DECLARE @errorSource VARCHAR(8000)
	DECLARE @errorDescription VARCHAR(8000)
	DECLARE @loadRetVal INT

	-- Initialize the XML document
	EXEC @retVal = sp_OACreate 'MSXML2.DOMDocument', @oXML OUTPUT
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	EXEC @retVal = sp_OASetProperty @oXML, 'async', 0
	IF @retVal <> 0
	BEGIN
 		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Load the XML into the document
	EXEC @retVal = sp_OAMethod @oXML, 'load', @loadRetVal OUTPUT, @tcFileName
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Get the loaded XML
	EXEC @retVal = sp_OAMethod @oXML, 'xml', @tcXMLString OUTPUT
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Release the reference to the COM object
	EXEC sp_OADestroy @oXML

END


все это взято с этого же форума!

трабл в том, что если запускать в виде процедуры exec dbo.KURS_GetKursValuteTable '01.01.2012', '01.02.2012', 'USD' , то результатом будет пустота!
если первый фрагмент кода вытащить отдельно, без компановки его в процедуру, то он будет выдавать список с курсами валют!

помогите разобраться, кучу времени потратил , но выяснить причины такого поведения не смог =/
ощущение что прав не хватает процедуре или что-то в этом роде

пытался добавлять в процедуру
и WITH EXECUTE AS OWNER
и WITH EXECUTE AS SELF
не помогает ...

если делаю от пользователя у которого вообще все права на все есть
WITH EXECUTE AS 'Ivanov.Ivan', то начинает материться на то, что прав таки нет!


Msg 229, Level 14, State 5, Procedure sp_OACreate, Line 1
The EXECUTE permission was denied on the object 'sp_OACreate', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 1
The EXECUTE permission was denied on the object 'sp_OASetProperty', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OADestroy, Line 1
The EXECUTE permission was denied on the object 'sp_OADestroy', database 'mssqlsystemresource', schema 'sys'.

(0 row(s) affected)

(0 row(s) affected)



че делать? help please
18 апр 12, 17:09    [12434626]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
А почему бы не открыть документацию и не выяснить какие разрешения необходимы для выполнения sp_OA*?
18 апр 12, 17:26    [12434764]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
invm
А почему бы не открыть документацию и не выяснить какие разрешения необходимы для выполнения sp_OA*?


патаму что я уже ставил для процедуры WITH EXECUTE AS OWNER и это не помогло, результат процедуры ПУСТОТА.

вы сами то пробовали добавить эти две процедуры и вызвать сначала процедуру KURS_GetKursValuteTable с параметрами, получить пустоту, а потом вместо процедуры вызвать сам текст процедуры , добавив те же параметры и получив результат, удивится!?
18 апр 12, 17:42    [12434875]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
invm
А почему бы не открыть документацию и не выяснить какие разрешения необходимы для выполнения sp_OA*?


добавлю так же, хотя я уже писал: что логин, по которому выдается ошибка находится в роли sysadmin, как и я, выполняющий и скрипт процедуры и процедуру тоже нахожусь в этой же роли
18 апр 12, 17:44    [12434902]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
rigid_joke
добавлю так же, хотя я уже писал: что логин, по которому выдается ошибка находится в роли sysadmin

Если бы это было так, то не было бы
Msg 229, Level 14, State 5, Procedure sp_OACreate, Line 1
The EXECUTE permission was denied on the object 'sp_OACreate', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 1
The EXECUTE permission was denied on the object 'sp_OASetProperty', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OADestroy, Line 1
The EXECUTE permission was denied on the object 'sp_OADestroy', database 'mssqlsystemresource', schema 'sys'.
Ибо для выполнения процедур sp_OA*
BOL
Requires membership in the sysadmin fixed server role.
18 апр 12, 18:10    [12435057]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
invm
rigid_joke
добавлю так же, хотя я уже писал: что логин, по которому выдается ошибка находится в роли sysadmin

Если бы это было так, то не было бы
Msg 229, Level 14, State 5, Procedure sp_OACreate, Line 1
The EXECUTE permission was denied on the object 'sp_OACreate', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OASetProperty, Line 1
The EXECUTE permission was denied on the object 'sp_OASetProperty', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OAMethod, Line 1
The EXECUTE permission was denied on the object 'sp_OAMethod', database 'mssqlsystemresource', schema 'sys'.
Msg 229, Level 14, State 5, Procedure sp_OADestroy, Line 1
The EXECUTE permission was denied on the object 'sp_OADestroy', database 'mssqlsystemresource', schema 'sys'.
Ибо для выполнения процедур sp_OA*
BOL
Requires membership in the sysadmin fixed server role.


согласен! но как вы тогда обоснуете, что из Managment Studio процедура подомной выполняется с ПУСТЫМ результатом, а текст самой процедуры выполняется нормально и выдает нужные значения курса валют?
18 апр 12, 18:16    [12435094]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
rigid_joke, я не собираюсь ничего обосновывать. Это вам надо представить скрипт, который подтверждает заявленный результат. Потому что, например, у меня ваша процедура отработала нормально и вернула требуемый набор.
18 апр 12, 18:38    [12435209]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
invm
rigid_joke, я не собираюсь ничего обосновывать. Это вам надо представить скрипт, который подтверждает заявленный результат. Потому что, например, у меня ваша процедура отработала нормально и вернула требуемый набор.


скрипт я предоставил один в один как у меня!
вот то, что у вас отработала ПРОЦЕДУРА сама, а не скрипт и вернула результат - это уже некий результат! только все равно непонятно в какую сторону копать .. =/

могу хоть принт-скрин предоставить с пустым выводом названий колонок и ни одной строчки, но только толку, если ошибок никаких не выскакивает ...
19 апр 12, 03:51    [12436768]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Я ваще-то не в теме но от сисадмина выполняется нормально:

exec [dbo].[KURS_GetKursValuteTable] @Bdate =  '20120419', @Edate = '20120419', @TypeValute = 'USD'


Date Rate CurrencyId
2012-04-19 00:00:00 29.4978 100



Монопенисуально выполняется:

exec ('[dbo].[KURS_GetKursValuteTable] @Bdate =  ''20120419'', @Edate = ''20120419'', @TypeValute = ''USD'' ')  AS  USER  = 'dbo' 

exec ('[dbo].[KURS_GetKursValuteTable] @Bdate =  ''20120419'', @Edate = ''20120419'', @TypeValute = ''USD'' ')  AS  login  = 'sa' 

exec ('[dbo].[KURS_GetKursValuteTable] @Bdate =  ''20120419'', @Edate = ''20120419'', @TypeValute = ''USD'' ')  AS  login  = 'folio' 


-------------------------------

А вот так работать не будет - ибо ЛОГИН не эквавалентен ЮЗЕРУ:

exec ('[dbo].[KURS_GetKursValuteTable] @Bdate =  ''20120419'', @Edate = ''20120419'', @TypeValute = ''USD'' ')  AS  user  = 'folio' 

Сообщение 229, уровень 14, состояние 5, процедура KURS_GetKursValuteTable, строка 1
Запрещено разрешение "EXECUTE" на объект "KURS_GetKursValuteTable" базы данных "похнах", схемы "dbo".
либо
Сообщение 229, уровень 14, состояние 5, процедура sp_OACreate, строка 1
The EXECUTE permission was denied on the object 'sp_OACreate', database 'mssqlsystemresource', schema 'sys'.

Сообщение было отредактировано: 20 апр 12, 09:48
19 апр 12, 09:57    [12437312]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

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

большой РЕСПЕК человеку, который не поленился выполнить и выложить свои исходники!!))))
все заработало! похоже дело в датах!!!!
где-то я не так конвертирую и выставляю, ибо с вот таким расскладом: '01.01.2012' не пашет! , а с '20120101' все четкО *)
20 апр 12, 09:37    [12443529]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
rigid_joke
SIMPLicity_,

большой РЕСПЕК человеку, который не поленился выполнить и выложить свои исходники!!))))
все заработало! похоже дело в датах!!!!
где-то я не так конвертирую и выставляю, ибо с вот таким расскладом: '01.01.2012' не пашет! , а с '20120101' все четкО *)



вообщем действительно коряво даты передаются!
помогло set dateformat dmy !
несмотря на то, что в процедуре эта фича присутствует (сам туда лепил) , конвертация неверная если не сделат вот так:

set dateformat dmy
exec dbo.KURS_GetKursValuteTable '01.01.2012', '01.02.2012', 'USD'
20 апр 12, 09:57    [12443621]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
rigid_joke
вообщем действительно коряво даты передаются!
помогло set dateformat dmy !
несмотря на то, что в процедуре эта фича присутствует (сам туда лепил) , конвертация неверная если не сделат вот так:

set dateformat dmy
exec dbo.KURS_GetKursValuteTable '01.01.2012', '01.02.2012', 'USD'



понял в чем была проблема! в этом помогла темка Опять про преобразование в DateTime

russish
С работающей программы профайлер показывает, что дата передается на сервер в виде YYYY-mm-DD hh:MM:ss, хотя в параметр SqlDbType::DateTime считывается и передается в виде DD-mm-YY hh:MM:ss. Значит преобразование идет из DD-mm-YY hh:MM:ss в YYYY-mm-DD hh:MM:ss и в таком виде идет на вход процедуры.

iljy
А вы хотели чтоб профайлер вам 2 целых числа показал? Или 8байтный бинарник? Если тип параметра datetime - он и передается как datetime, а профайлер вам покажет его значение, переведенное в текст в соответствие с настройками сервера.


russish
Получается, надо где-то искать настройки даты в системе, но на серваке (Windows 2003), где нормально все работает региональные настройки такие же, что и на том (Windows 2008), где программа работает с ошибкой.
Вопрос немного трансформируется, где еще что-то в системе можно настроить?

iljy
Искать надо в программе, которая некорректно формирует дату. Скуль тут вообще не при чем, дата неверно формируется скорее всего при задании значения параметра. Если программа использует преодбразование в дату из строки в соответствии с региональными настройками клиента - выкиньте ее и убейте разработчика (в крайнем случае кастрируйте).

- золотые слова! сам себя кастрировать не буду)))

если в двух словах, то: я передаю строку, в процедуре объявленна дата, а set dateformat я делаю уже вообще после всего этого))))
20 апр 12, 10:07    [12443672]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Да простит меня И.Бен-Ган,
но просто не могу уже не процитировать:

Тип данных Не зависящие от языка форматы Примеры
datetime'YYYYMMDD hh:mm:ss.nnn' '20090212 12:30:15.123'
'yyyy-mm-ddThh:mm:ss.nnn''2009-02-12T12:30:15.123'
'YYYYMMDD''20090212'

Тип данных Не зависящие от языка форматы Примеры
smalldatetime'YYYYMMDD hh:mm' '20090212 12:30'
'yyyy-mm-ddThh:mm''2009-02-12T12:30'
'YYYYMMDD''20090212'

Тип данных Не зависящие от языка форматы Примеры
DATE 'YYYYMMDD''20090212'
'yyyy-mm-dd''2009-02'


Передавайте и правильно поняты будете!...

PS По книге: Ицик Бен-Ган, "Microsoft SQL Server 2008. Основы T-SQL"
20 апр 12, 17:29    [12447565]     Ответить | Цитировать Сообщить модератору
 Re: права на процедуру / пустой вызов процедуры / курс валют  [new]
rigid_joke
Member

Откуда:
Сообщений: 141
SIMPLicity_
Передавайте и правильно поняты будете!...

PS По книге: Ицик Бен-Ган, "Microsoft SQL Server 2008. Основы T-SQL"


спасибо!)))))
20 апр 12, 18:17    [12447897]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить