Добрый день! Производил привязку данных по правам на администрируемые операции. Написал скрипт по предварительному удалению записей по фильтру и привязал данные. При обновлении из свн на другом сайте, после обновления сайт перестал работать. В логах приложения ошибка. Будьте добры, подскажите как решить данную проблему.

 

2018-10-26 17:22:07,220 [5] ERROR IIS APPPOOL\ArdshinBank7102-3 Terrasoft.WebApp.FileWebEventProvider ProcessEvent - Date: 26.10.2018 17:22:07
Date (UTC): 26.10.2018 13:22:07

Exception Message: Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, , =, >, >= или используется в качестве выражения.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider

Exception Stack Trace:
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   в System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
   в System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   в System.Data.SqlClient.SqlDataReader.Read()
   в Terrasoft.Core.DB.DBSecurityEngine.GetCurrentUserAdminOperationsFromDB()
   в Terrasoft.Core.DB.DBSecurityEngine.InitializeCurrentUserAdministratedOperations(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetCanExecuteOperation(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevels(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevel(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetIsEntitySchemaReadingAllowed(String schemaName)
   в Terrasoft.Core.Entities.EntitySchemaQuery.CreateSelect()
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetSelectQuery(UserConnection userConnection)
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)
   в Terrasoft.Configuration.FeatureUtilities.GetFeatureState(UserConnection source, String code)
   в Terrasoft.Configuration.FeatureUtilities.GetIsFeatureEnabled(UserConnection source, String code)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetModuleStructure(UserConnection userConnection)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.Configuration.SectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponse response)
   в Terrasoft.WebApp.Nui.ViewModule.SetupModulesConfig()
   в Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)
   в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   в System.Web.UI.Control.OnLoad(EventArgs e)
   в System.Web.UI.Control.LoadRecursive()
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Нравится

6 комментариев
Лучший ответ
SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

Без ошибок из лога  и сообщений в консоли броузера трудно чтото сказать. Разве что посоветовать обратится в тех поддержку.

Запросите у поддержке sql скрипты для перераздачи прав на существующие обекты и выполните их для тех объектов что вы меняли! Свежий бэкап есть или вы делали на среде разработки?

Есть приложение на маркет плэйсе  которое раздает права на созданные записи (актуальнот если изминили права и хотите распространить это на существующие объекты)  но если входа не происходит это вам не поможет!

Где-то есть подзапрос, который выдаёт более одной строки, хотя логика внешнего SQL-запроса ожидает одну. Вызывается он в стандартной функции ядра GetCurrentUserAdminOperationsFromDB. Видимо, при работе скрипта или переносе залилось некорректное наполнение в таблицы прав.

Где именно, можно увидеть, записав в профайлере запрос, происходящий перед падением.

вот же

TOP (1) ставьте 

Я так понимаю что это из-за неправильно разданных прав происходит ошибка, в явном виде никто sql не корректировал. Так что  про TOP 1 єто не в тему 

SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

Показать все комментарии

Здравствуйте, Коллеги!:)
В моей работе потребовалось закрыть доступ к ряду справочников(возможен только просмотр). Появилась проблема со справочником ОПФ. Этот справочник открывается особым образом(прикрепил картинку). Пробовал через администрирование, получается, но он блокирует для всех, кроме сис. админов, а мне требуется перекрыть именно всем, даже сис. админу. Помогите, пожалуйста, добрые люди:)

Нравится

2 комментария

Здравствуйте, Артем!

Можно ограничить права на редактирование справочников с помошью права доступа на операцию с кодом CanManageLookup.

"Мотков Илья" написал:

Можно ограничить права на редактирование справочников с помошью права доступа на операцию с кодом CanManageLookup.

Илья, а что делать с другими справочниками, если забрать права на эту операцию у всех? Апдейтить на уровне БД или есть какое-то более адекватное решение?

Показать все комментарии

Здравствуйте, Коллеги!:)
В моей работе потребовалось закрыть доступ к ряду справочников(возможен только просмотр). Появилась проблема со справочником ОПФ. Этот справочник открывается особым образом(прикрепил картинку). Пробовал через администрирование, получается, но он блокирует для всех, кроме сис. админов, а мне требуется перекрыть именно всем, даже сис. админу. Помогите, пожалуйста, добрые люди:)

Нравится

3 комментария

Здравствуйте!

Особенность системных администраторов в том, что они могут делать все.
Это администрируется системными операциями:

  • CanDeleteEverything
  • CanInsertEverything
  • CanSelectEverything
  • CanUpdateEverything

Для того, чтобы запретить всем пользователям вносить изменения в справочник необходимо создать соответствующую логику на уровне объекта справочника.

По умолчанию во всех справочниках проверяются права на системную операцию CanManageLookups (логика родительского объекта BaseLookup). Проверка реализована в процессе объекта в методе CanManageLookups.

Можно сделать следующее:
1) Создать новую системную операцию и никому на нее права не давать. Предположим, что ее код CanManageSpecialLookups. Естественно, права на эту операцию мы никому не даем.
2) Заместить объект справочника, в процессе объекта переопределить метод CheckCanManageLookups (установить признак "Переопределен").
Переопределенный метод должен выглядеть следующим образом:
UserConnection.DBSecurityEngine.CheckCanExecuteOperation("CanManageSpecialLookups");

После публикации только пользователи с правами на системную операцию CanManageSpecialLookups (то есть никто) смогут менять/добавлять/изменять данные справочника.

Спасибо, Алексей! Получилось

Так понятно объяснено и в краткие сроки:)

Показать все комментарии