Недопустимое использование оператора с побочным действием или
als-a Откуда: | Не пойму что не так (ногами не бейте вчера MsSql Server 2005 Rus поставил) в Microsoft SQL Server Management Studio (9.00.2047.00) пытаюсь создать фунцию вот текст — ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO — ============================================= CREATE FUNCTION GET_ID ( — Add the parameters for the function here ) RETURNS int AS BEGIN DECLARE @a int, @ID_COUNT_0 int Select @ID_COUNT_0=ID_COUNT_0 from dbo.Counters Set @a=@ID_COUNT_0 Set @ID_COUNT_0=@ID_COUNT_0+1 Update dbo.Counters set ID_COUNT_0 = @ID_COUNT_0 END Сообщение 443, уровень 16, состояние 15, процедура GET_ID, строка 17 Таблица dbo.Counters состоит из одного столбца int в ней одна запись где ID_COUNT_0=1 |
daw Откуда: Муром -> Москва | в функциях запрещены dml операторы над постоянными таблицами. Posted via ActualForum NNTP Server 1.4 |
Glory Откуда: |
А что непонятного в сообщении |
als-a Откуда: | а процедуры ? |
Glory Откуда: | Двести |
daw Откуда: Муром -> Москва | >а процедуры ? в процедурах — можно. но процедуры нельзя напрямую в запросах использовать. Posted via ActualForum NNTP Server 1.4 |
daw Откуда: Муром -> Москва | >а процедуры ? или вы в смысле — вызывать процедуры в функциях? Posted via ActualForum NNTP Server 1.4 |
als-a Откуда: | То есть запихнуть Update в процедуру и вызвать процедуру из функции тоже не прокатит ? |
проходящий. Guest |
Ничего не знаю, ничего не понимаю, но первое что сделаю — свой генератор последовательностей. |
Glory Откуда: |
Можно один раз открыть в хелпе перечень ограничений udf-ов и узнать о них всех сразу |
pkarklin Откуда: Москва (Муром) |
ну и делайте на основе процедуры. |
als-a Откуда: | Ну по поводу Ничего не знаю, ни чего не понимаю: Я более 10 лет работал с Oracle. а по поводу но первое что сделаю — свой генератор последовательностей. Без него ж никак! : на чем-то надо ж эксперементы проводить… Кстати в Oracle в фунции можно писать что угодно, чего-то парни из Microsoft не додумали … |
Гавриленко Сергей Алексеевич Откуда: Moscow |
У вас два варианта: или отвыкать от того, к чему вы привыкли на оракле, или писать дальше на оракле. |
pkarklin Откуда: Москва (Муром) |
М.б. свойством IDENTITY(1, 1) обойдетесь?! |
als-a Откуда: | да обойтись можно то можно а как же эксперименты ? |
Glory Откуда: |
После 10лет работы с Oracle это скорее будут не эксперименты, а попытки эмулировать Oracle на MSSQL |
pkarklin Откуда: Москва (Муром) |
О каких экспериментах идет речь?! Попытка реализовать на MS SQL Oracle? |
als-a Откуда: |
В другое место ушел работать, на Oracle золотого запаса здесь не хватает. Тут базы под акцесом сделаны, так то это не очень хорошо … Так что надо потихонечку мигрировать куда — нибудь, похоже на MS SQL Server ….. |
als-a Откуда: | да и под нарезанные задачи — Oracle все равно что из пушки по воробьям … |
pkarklin Откуда: Москва (Муром) |
Тогда резко забываем об Oracle и осваиваем «парадигму» MS SQL. 😉 |
tpg Откуда: Novosibirsk |
С чего это вы решили, что не додумали? Половина команды разработки сиквела — это аккурат бывшие разработчики оракла. Видимо таким образом они решили отказаться от тупиковых путей (перейдя в MS) 😉 |
SQLMantis Откуда: Москва | Если бы подобное было разрешено, что вернул бы запрос: select GET_ID, ID_COUNT_0 from dbo.Counters ? |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
ValGer Откуда: Псков | Казалось бы тривиальная задачка. Хочу создать функцию, которая бы выдавала наружу код новой записи в таблице. Код автоинкрементный, с шагом +1. Это достигается чтением @@IDENTITY после создания новой строки. Пишу функцию (в студии SQL 2008 R2): ALTER FUNCTION [dbo].[НомерНовогоРаботника] INSERT INTO dbo.MAIN RETURN @@IDENTITY Проверка синтаксиса в студии говорит, что всё хорошо, но как только пытаюсь выполнить (то есть записать эту функцию в базу — ALTER) выдаётся странная ошибка: Сообщение 443, уровень 16, состояние 15, процедура НомерНовогоРаботника, строка 7 Проверил отдельно INSERT — всё прекрасно вставляется. |
locky Откуда: Харьков, Украина |
это означает ровно то, что написано — «нельзя использовать insert в функции» — равно как и еще некоторый набор стейтментов |
iap Откуда: Москва | ValGer, из UDF нельзя менять данные в постоянных и временных таблицах. |
ValGer Откуда: Псков | locky, Спасибо, просветили! Читая книжки, наверно, пропустил. |
locky Откуда: Харьков, Украина |
Топ 10, вопрос №4 |
ValGer Откуда: Псков | iap, Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное — спасибо просветили. |
Ennor Tiegael Откуда: | ValGer, На самом деле, insert использовать в функциях можно, но только с табличными переменными (они пока по определению локальны). Общее же правило — выполнение функции не должно приводить к изменению чего-либо за ее пределами — сформулировано в доке довольно четко. |
locky Откуда: Харьков, Украина |
https://msdn.microsoft.com/ru-ru/library/ms186755(v=sql.100).aspx разделы «Совместимость» и «Ограничения» https://msdn.microsoft.com/ru-ru/library/ms191320(v=sql.100).aspx раздел «Рекомендации»: «Изменения таблиц баз данных, операции с курсорами, не являющимися локальными для данной функции, отправка электронной почты, попытка изменения каталога, формирование результирующего набора, возвращаемого пользователю — это примеры действий, выполнение которых внутри функции невозможно.» |
SIMPLicity_ Откуда: (((@))) | Перепишите на хранимую процедуру,- проблем со вставкой не будет. первой строкой set nocount on в последней — select @NewId (который у Вас @@identity) |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Multy Откуда: | Пытаемся создать функцию типа Create FUNCTION dbo.Ins ( @Pr1 Int, @Pr2 Int ) RETURNS @Rez1 TABLE ( Rez1 Int, Rez2 Int ) AS BEGIN insert into dbo.Rez(Rez1,Rez2) Values(@Pr1,@Pr2) insert into @Rez Values(1,1) RETURN END Получаем ошибку: Сообщение 443, уровень 16, состояние 15, процедура Insert, строка 13 Недопустимое использование оператора «INS», оказывающего побочное действие, в функции. Это можно как-нибудь обойти или отключить? Alter Procedure dbo.Ins ( @Pr1 Int, @Pr2 Int ) AS BEGIN insert into dbo.Rez(Rez1,Rez2) Values(@Pr1,@Pr2) Select * from dbo.Rez END Или инсерты взможны только в процедурах? |
Nailbomb Guest | в функциях инсерты делать нельзя |
Multy Откуда: |
Это они не доработали, или скорее переработали… |
Гавриленко Сергей Алексеевич Откуда: Moscow |
Да нет, это просто кто-то хелп не дочитал. |
Козьма Прутков Откуда: Москва | Multy, а точно надо писать dbo.Rez а не @Rez1? В результирующую таблицу инсенртить можно, а в остальные — нет. Create FUNCTION dbo.Ins |
Multy Откуда: |
В результирующию то понятно, смысл был как раз в побочную таблицу. |
Козьма Прутков Откуда: Москва | Multy, а что за задача такая, при которой надо что-то менять в обычных таблицах? Уж не генератор ли каких номеров, или упаси бог ключей, вы пытаетесь написать? |
проходящий. Guest |
И есть достаточное обоснование такой надобности? Можно его глянуть? |
Пятница_13 Guest | Козьма Прутков, А вот тут подробнее ! Про ключи особенно. |
Aleksey-K Откуда: Москва |
Это не совсем верная информация. |
Козьма Прутков Откуда: Москва | Aleksey-K, ладно уж придираться-то, я оперирую в терминах вопроса, а не пытаюсь пересказать BOL 🙂 |
Козьма Прутков Откуда: Москва |
Даже не знаю, что ответить. Может, лучше вопрос переформулировать? Есть просто любители писать генераторы ключей, 99% которых просто не знают, как воспользоваться уже имеющимися возможностями MSSQL, или возможностями технологии разработки кода, который работает с БД. Поскольку любителей таких много — потому сразу и спрашиваю. |
Пятница_13 Guest |
Да, надо признать — я один из тех. А может просто привычка после Firebird-а и Oracle-а. |
Козьма Прутков Откуда: Москва | Пятница_13, не вижу смысла своими словами рассказывать, почитайте в BOL про identity, @@identity, scope_identity(). А также uniqueidentifier, newid() если хочется глобальной уникальности при невысокой производительности. Будут конкретные вопросы — задавайте уже их. |
Пятница_13 Guest | Козьма Прутков, Предлагаете изменить привычкам ? |
Glory Откуда: |
Непривычно == некрасиво ? Красивость мереется по длине кода ? |
Пятница_13 Guest |
В т.ч. и по длине кода )) |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Евгений
22.02.2015 1:25
Добрый день.
Пытался обновить конфигурацию 1С:Деньги 8 до версии 2.0.15.8 через встроенную сервисную функцию программы. Во время обновления появилось уведомление о том, что обновление необходимо производить на версии платформы не ниже 8.3.5, после чего база не открывается: при попытке входа выдается ошибка: Недопустимо использование свойства «ОсновнаяРоль»
Сервисная информация приведена ниже. Обновление платформы картину не меняет. Как можно решить проблему?
Платформа: 1С:Предприятие 8.3 (8.3.5.1443)Конфигурация: Деньги 8, редакция 2.0 (2.0.15.8) (https://v8.1c.ru/money)Copyright © ООО «1C», 2009-2014. Все права защищены(https://www.1c.ru)Режим: Файловый (без сжатия)Приложение: Тонкий клиентЛокализация: Информационная база: русский (Россия), Сеанс: русский (Россия)Вариант интерфейса: Такси
Ошибки:———————————————————————————
22.02.2015 1:18:46{ОбщийМодуль.Пользователи.Модуль(129)}: Ошибка при получении значения атрибута контекста (ОсновнаяРоль) Если НЕ ЗначениеЗаполнено(ПользовательИБ.Имя) И Метаданные.ОсновнаяРоль = Неопределено Тогдапо причине:Недопустимо использование свойства «ОсновнаяРоль»
Заранее благодарю.
Евгений
22.02.2015 2:28
Уточнение: сейчас обнаружил, что на старой версии платформы база открывается, а на новой (8.3.5) — нет. Под новой версией платформы открывается конфигуратор, но при выборе пункта «Конфигурация -> Поддержка -> Обновить конфигурацию» система после подключения к серверу с обновлениями предлагает обновить только демо базу (см.скриншот), то есть как будто не видит основную БД, возможно, считая ее уже обновленной.
Евгений
22.02.2015 11:11
Проблему удалось решить, обновив базу через Конфигуратор (несмотря на описанное в предыдущем сообщении впечатление, что система собирается обновлять только демо базу).
Топик не удаляю, оставляю на усмотрение модератора: может быть кому-то пригодится.
P.S. Уважаемые разработчики, убедительная просьба реализовать автоматическую проверку наличия нужной версии платформы, в случае если это критично для обновления конфигурации. Это спасет много времени и нервов как ползователям, так и службе поддержки 1С.
Панов Сергей Анатольевич
23.02.2015 14:20
Дорый день!
Подскажите, как или где скачать платформу 8.3.5
Спасибо!
Максим Ч.
25.02.2015 9:00
Здесь: https://users.v8.1c.ru/distribution/version_files?nick=Platform83&ver=8.3.5.1460
Дмитрий
09.03.2015 2:42
https://www.forum.mista.ru/topic.php?id=717446
«Для работы на платформе 8.3.5 1С:Деньги требуется обновить до версии не ниже 2.0.15.9. Автоматическое обновление через интернет до версии 2.0.14 было ошибочным, приносим свои извинения.
Обойти ошибку, связанную с «атрибутом ОсновнаяРоль» можно двумя способами:
1.Создать пользователя информационной базы.
Для этого откройте базу в режиме конфигуратора, выберите в меню «Администрирование» пункт «Пользователи». Добавьте в список нового пользователя, на вкладке «Прочее» отметьте галочкой две роли: «Администратор системы» и «Полные права», другие роли отмечать не нужно.
Откройте информационную базу в режиме предприятия от имени созданного пользователя. Дальнейшая работа и обновления могут выполняться в обычном режиме.
Если Вы не хотите создвать пользователя, можете воспользоваться вторым способом:
2. Обновиться до последней версии в режиме конфигуратора.
Для этого откройте базу в режиме конфигуратора и выберите в меню «Конфигурация» — «Поддержка» — «Обновить конфигурацию». В диалоге обновления выберите пункт «Поиск доступных обновлений» и нажмите «Далее».
В списке «Искать обновления в каталогах» отметьте галочкой каталог » downloads.v8.1c.ru/tmplt… »»» и нажмите «Далее». В списке новых версий выберите версию 2.0.15.9 и нажмите «Готово», затем — «Продолжить обновление». Дождитесь окончания обновления и на вопрос «Обновить базу данных» ответьте «Да», «Принять».
Полсе обновления информационной базы конфигуратор можно закрывать и открывать базу в режиме предприятия. Дальнейшая работа может выполняться в обычном режиме.»