AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.05.2010, 18:06   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Сбой запроса на разрешение типа "SqlStatementExecutePermission".
Сбой запроса на разрешение типа "SqlStatementExecutePermission".

Сбой запроса на разрешение типа "SqlStatementExecutePermission".
(S)\Classes\SqlStatementExecutePermission\demand
(S)\Classes\Statement\executeQuery

Каких прав доступа не хватает?

Вызываю метод класса на стороне сервера:
X++:
server static SET pGet_Items()
{
    Connection  con = new Connection();
    Statement   stmt = con.createStatement();
    ResultSet   resultSet;

    set s1 = new set (types::Container);
    ;

    new SqlStatementExecutePermission(sqlExpression).assert();
    sqlExpression = Strfmt("exec [pGet_Items_CLEAR] '%1'", InventParameters::find().it_SQLDB);
    resultSet = stmt.executeQuery(sqlExpression);
    CodeAccessPermission::revertAssert();

    return s1;
}
Все время валится на stmt.executeQuery(sqlExpression);

Процедуру элементарную вызывает
Код:
ALTER PROCEDURE [dbo].[pGet_Items_CLEAR] 
		@DB		varchar(20)
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @TableName	varchar(50)
	SET @TableName = '.dbo.Items'; 	  

	EXEC ('TRUNCATE TABLE ' + @DB + @TableName)
	
	Select 0 as [tmp];
	
END
С чем это связано ошибка?

Вызов другой процедуры проходит нормально, которая возвращает строки. Но в той процедуре тоже есть строка EXEC ('TRUNCATE TABLE ' + @DB + @TableName), но она почему то не отрабатывает при вызове процедуры из аксапты. Таблица так и остается полной.

Собственно запрос в SQL Profiler:
Код:
declare @p1 int
set @p1=0
declare @p3 int
set @p3=2
declare @p4 int
set @p4=8193
declare @p5 int
set @p5=0
exec sp_cursoropen @p1 output,N'exec pGet_Items ''Test''',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5
Если подключится с правами юзера АОС к сиквелу и запустить код из профайлера то все отлично отрабатывает , и EXEC ('TRUNCATE TABLE ' + @DB + @TableName) тоже.

Не пойму почему с вызовом хранимой процедуры из аксапты такая проблема.
Старый 07.05.2010, 18:31   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate().
Для решения проблемы нужно сделать одно из двух действий:
а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet)
б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function()
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Poleax (5).
Старый 11.05.2010, 11:51   #3  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate().
Для решения проблемы нужно сделать одно из двух действий:
а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet)
б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function()
В FUNCTION (Transact-SQL) http://msdn.microsoft.com/ru-ru/libr...SQL.90%29.aspx
Цитата:
Пользовательская функция не может выполнять действия, изменяющие состояние базы данных.
т.е. в самом теле функции EXEC или TRUNCATE TABLE запрещен.

Последний раз редактировалось Poleax; 11.05.2010 в 12:10.
Старый 11.05.2010, 14:19   #4  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Вопрос закрыт.
X++:
    sqlExpression = Strfmt("TRUNCATE TABLE %1.dbo.Items", InventParameters::find().SQLDB);
    new SqlStatementExecutePermission(sqlExpression).assert();
    stmt.executeUpdate(sqlExpression);
    CodeAccessPermission::revertAssert();
MSDN SqlStatementExecutePermission Class
Dynamics Ax 'SqlStatementExecutePermission' failed
Поиск SqlStatementExecutePermission по форуму

Последний раз редактировалось Poleax; 02.03.2011 в 19:15.
Старый 11.05.2010, 14:20   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Мдя.... как-то не задумался о том, что не все можно из функции вызвать...
А тогда такой вопрос (он конечно может и не в тему) - а спасет вызов
X++:
new SqlDataDictionary().tableTruncate(tablenum(InventParameters))
?

PS Упс... опоздал
__________________
Возможно сделать все. Вопрос времени
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сбой запроса на разрешение типа "FileIOPermission" Silphidae DAX: Программирование 17 13.04.2009 14:30
Задать критерий типа !="" bobski DAX: Программирование 3 29.12.2008 08:23
Ошибка: фантомное дублирующее поле типа "дата" в гриде belugin DAX: Программирование 8 14.06.2006 00:15
Странный эффект. OLAP и измерение типа "перечислимый тип" chi DAX: Программирование 1 28.12.2005 12:31
Как при удалении записи из таблицы подавить вывод запроса "Удалить запись?" Anders DAX: Программирование 2 05.05.2004 17:52

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:11.