07.05.2010, 18:06 | #1 |
Модератор
|
Сбой запроса на разрешение типа "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; } Процедуру элементарную вызывает Код: 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 Не пойму почему с вызовом хранимой процедуры из аксапты такая проблема. |
|
07.05.2010, 18:31 | #2 |
Administrator
|
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate(). Для решения проблемы нужно сделать одно из двух действий: а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet) б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function()
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Poleax (5). |
11.05.2010, 11:51 | #3 |
Модератор
|
Цитата:
Сообщение от sukhanchik
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate(). Для решения проблемы нужно сделать одно из двух действий: а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet) б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function() Цитата:
Пользовательская функция не может выполнять действия, изменяющие состояние базы данных.
Последний раз редактировалось Poleax; 11.05.2010 в 12:10. |
|
11.05.2010, 14:19 | #4 |
Модератор
|
Вопрос закрыт.
X++: sqlExpression = Strfmt("TRUNCATE TABLE %1.dbo.Items", InventParameters::find().SQLDB); new SqlStatementExecutePermission(sqlExpression).assert(); stmt.executeUpdate(sqlExpression); CodeAccessPermission::revertAssert(); Dynamics Ax 'SqlStatementExecutePermission' failed Поиск SqlStatementExecutePermission по форуму Последний раз редактировалось Poleax; 02.03.2011 в 19:15. |
|
11.05.2010, 14:20 | #5 |
Administrator
|
Мдя.... как-то не задумался о том, что не все можно из функции вызвать...
А тогда такой вопрос (он конечно может и не в тему) - а спасет вызов X++: new SqlDataDictionary().tableTruncate(tablenum(InventParameters)) PS Упс... опоздал
__________________
Возможно сделать все. Вопрос времени |
|
|
|