|
|
#1 |
|
Модератор
|
Сбой запроса на разрешение типа "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 Не пойму почему с вызовом хранимой процедуры из аксапты такая проблема. |
|
|
|
|
#2 |
|
Administrator
|
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate(). Для решения проблемы нужно сделать одно из двух действий: а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet) б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function()
__________________
Возможно сделать все. Вопрос времени |
|
|
|
| За это сообщение автора поблагодарили: Poleax (5). | |
|
|
#3 |
|
Модератор
|
Цитата:
Сообщение от sukhanchik
Я как-то давно сталкивался с проблемой в том, что несмотря на то, что хранимая процедура как бы возвращает значение - она реально его не возвращает (дело было еще в аксессе, но это фича общая).
Т.е. ошибка не в разрешении самом, а в использовании метода executeQuery() вместо executeUpdate(). Для решения проблемы нужно сделать одно из двух действий: а) Заменить вызов executeQuery() на executeUpdate() и отказаться от анализа результатов отработки процедуры (от resultSet) б) Заменить процедуру функцией, которая возвращает таблицу. В этом случае нужно вместо exec procedure() писать select * from function() Цитата:
Пользовательская функция не может выполнять действия, изменяющие состояние базы данных.
Последний раз редактировалось Poleax; 11.05.2010 в 12:10. |
|
|
|
|
#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. |
|
|
|
|
#5 |
|
Administrator
|
Мдя.... как-то не задумался о том, что не все можно из функции вызвать...
А тогда такой вопрос (он конечно может и не в тему) - а спасет вызов X++: new SqlDataDictionary().tableTruncate(tablenum(InventParameters)) PS Упс... опоздал
__________________
Возможно сделать все. Вопрос времени |
|
|
|
|
|