Недопустимое использование оператора с побочным действием или

Недопустимое использование оператора с побочным действием или thumbnail

als-a
Member

Откуда:
Сообщений: 7

Не пойму что не так (ногами не бейте вчера 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
RETURN (@a)

END
GO

Нажимаю кнопочку «Показать предполагаемый план выполнения» и получаю следующее сообщение:

Сообщение 443, уровень 16, состояние 15, процедура GET_ID, строка 17
Недопустимое использование оператора с побочным действием или зависимого от времени в «UPDATE» в функции.

Таблица dbo.Counters состоит из одного столбца int в ней одна запись где ID_COUNT_0=1
Что не так ?

daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

в функциях запрещены dml операторы над постоянными таблицами.

Posted via ActualForum NNTP Server 1.4

Glory
Member

Откуда:
Сообщений: 104760

als-a

Сообщение 443, уровень 16, состояние 15, процедура GET_ID, строка 17
Недопустимое использование оператора с побочным действием или зависимого от времени в «UPDATE» в функции.

Таблица dbo.Counters состоит из одного столбца int в ней одна запись где ID_COUNT_0=1
Что не так ?

А что непонятного в сообщении
Недопустимое использование оператора с побочным действием или зависимого от времени в «UPDATE»

als-a
Member

Откуда:
Сообщений: 7

а процедуры ?

Glory
Member

Откуда:
Сообщений: 104760


Двести

daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

>а процедуры ?

в процедурах — можно. но процедуры нельзя напрямую в запросах использовать.

Posted via ActualForum NNTP Server 1.4

daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

>а процедуры ?

или вы в смысле — вызывать процедуры в функциях?
вызов процедур там тоже запрещен. расширенные (extended) только можно.

Posted via ActualForum NNTP Server 1.4

als-a
Member

Откуда:
Сообщений: 7

То есть запихнуть Update в процедуру и вызвать процедуру из функции тоже не прокатит ?

проходящий.

Guest

als-a
Не пойму что не так (ногами не бейте вчера MsSql Server 2005 Rus поставил)
Set @ID_COUNT_0=@ID_COUNT_0+1

Update dbo.Counters set ID_COUNT_0 = @ID_COUNT_0

Ничего не знаю, ничего не понимаю, но первое что сделаю — свой генератор последовательностей.
Без него ж никак! 🙂

Glory
Member

Откуда:
Сообщений: 104760

als-a
То есть запихнуть Update в процедуру и вызвать процедуру из функции тоже не прокатит ?

Можно один раз открыть в хелпе перечень ограничений udf-ов и узнать о них всех сразу

pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927

проходящий.
Ничего не знаю, ничего не понимаю, но первое что сделаю — свой генератор последовательностей.
Без него ж никак! 🙂

ну и делайте на основе процедуры.

als-a
Member

Откуда:
Сообщений: 7

Ну по поводу Ничего не знаю, ни чего не понимаю: Я более 10 лет работал с Oracle.
а по поводу но первое что сделаю — свой генератор последовательностей.
Без него ж никак! : на чем-то надо ж эксперементы проводить…

Кстати в Oracle в фунции можно писать что угодно, чего-то парни из Microsoft не додумали …

Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36928

als-a
Ну по поводу Ничего не знаю, ни чего не понимаю: Я более 10 лет работал с Oracle.
а по поводу но первое что сделаю — свой генератор последовательностей.
Без него ж никак! : на чем-то надо ж эксперементы проводить…

Кстати в Oracle в фунции можно писать что угодно, чего-то парни из Microsoft не додумали …

У вас два варианта: или отвыкать от того, к чему вы привыкли на оракле, или писать дальше на оракле.

pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927

автор
а по поводу но первое что сделаю — свой генератор последовательностей.

М.б. свойством IDENTITY(1, 1) обойдетесь?!

als-a
Member

Откуда:
Сообщений: 7

да обойтись можно то можно а как же эксперименты ?

Glory
Member

Откуда:
Сообщений: 104760

als-a
да обойтись можно то можно а как же эксперименты ?

После 10лет работы с Oracle это скорее будут не эксперименты, а попытки эмулировать Oracle на MSSQL

pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927

als-a
да обойтись можно то можно а как же эксперименты ?

О каких экспериментах идет речь?! Попытка реализовать на MS SQL Oracle?

als-a
Member

Откуда:
Сообщений: 7

Гавриленко Сергей Алексеевич
als-a
Ну по поводу Ничего не знаю, ни чего не понимаю: Я более 10 лет работал с Oracle.
а по поводу но первое что сделаю — свой генератор последовательностей.
Без него ж никак! : на чем-то надо ж эксперементы проводить…

Кстати в Oracle в фунции можно писать что угодно, чего-то парни из Microsoft не додумали …

У вас два варианта: или отвыкать от того, к чему вы привыкли на оракле, или писать дальше на оракле.

В другое место ушел работать, на Oracle золотого запаса здесь не хватает. Тут базы под акцесом сделаны, так то это не очень хорошо … Так что надо потихонечку мигрировать куда — нибудь, похоже на MS SQL Server …..

als-a
Member

Откуда:
Сообщений: 7

да и под нарезанные задачи — Oracle все равно что из пушки по воробьям …

pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927

als-a
Так что надо потихонечку мигрировать куда — нибудь, похоже на MS SQL Server …..

Тогда резко забываем об Oracle и осваиваем «парадигму» MS SQL. 😉

tpg
Member

Откуда: Novosibirsk
Сообщений: 23902

als-a
…чего-то парни из Microsoft не додумали …

С чего это вы решили, что не додумали? Половина команды разработки сиквела — это аккурат бывшие разработчики оракла. Видимо таким образом они решили отказаться от тупиковых путей (перейдя в MS) 😉

SQLMantis
Member

Откуда: Москва
Сообщений: 239

Если бы подобное было разрешено, что вернул бы запрос:
select GET_ID, ID_COUNT_0 from dbo.Counters ?

Источник

ValGer
Member

Откуда: Псков
Сообщений: 443

Казалось бы тривиальная задачка.
Хочу создать функцию, которая бы выдавала наружу код новой записи в таблице. Код автоинкрементный, с шагом +1. Это достигается чтением @@IDENTITY после создания новой строки. Пишу функцию (в студии SQL 2008 R2):

ALTER FUNCTION [dbo].[НомерНовогоРаботника]
(
)
RETURNS numeric
AS
BEGIN

INSERT INTO dbo.MAIN
(НомерРайона, НомерРегиона, КодШколы, Фамилия, ИмяОтчество,
Пол, ДатаРождения, ОсновнаяДолжность)
VALUES
(1, 60, 1, ‘Анекто’, ‘Некто Нектович’, ‘Ж’, ‘01.01.1990’, 8)

RETURN @@IDENTITY
END

Проверка синтаксиса в студии говорит, что всё хорошо, но как только пытаюсь выполнить (то есть записать эту функцию в базу — ALTER) выдаётся странная ошибка:

Сообщение 443, уровень 16, состояние 15, процедура НомерНовогоРаботника, строка 7
Недопустимое использование оператора «INSERT», оказывающего побочное действие, в функции
.

Проверил отдельно INSERT — всё прекрасно вставляется.
Что это может означать?

locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

ValGer
Что это может означать?

это означает ровно то, что написано — «нельзя использовать insert в функции» — равно как и еще некоторый набор стейтментов
это прекрасно описано в BOL в разделе по созданию UDF

iap
Member

Откуда: Москва
Сообщений: 46975

ValGer,

из UDF нельзя менять данные в постоянных и временных таблицах.

ValGer
Member

Откуда: Псков
Сообщений: 443

locky,

Спасибо, просветили! Читая книжки, наверно, пропустил.
Видимо, в процедуре можно?
Кстати что такое BOL? Дайте ссылочку.
С уважением …

locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

ValGer
locky,

Спасибо, просветили! Читая книжки, наверно, пропустил.
Видимо, в процедуре можно?
Кстати что такое BOL? Дайте ссылочку.
С уважением …

Топ 10, вопрос №4

ValGer
Member

Откуда: Псков
Сообщений: 443

iap,

Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное — спасибо просветили.

Ennor Tiegael
Member

Откуда:
Сообщений: 3240

ValGer,

На самом деле, insert использовать в функциях можно, но только с табличными переменными (они пока по определению локальны).

Общее же правило — выполнение функции не должно приводить к изменению чего-либо за ее пределами — сформулировано в доке довольно четко.

locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

ValGer
iap,

Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное — спасибо просветили.

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_
Member

Откуда: (((@)))
Сообщений: 8696

Перепишите на хранимую процедуру,- проблем со вставкой не будет.
первой строкой set nocount on
в последней — select @NewId (который у Вас @@identity)

Источник

Multy
Member [заблокирован]

Откуда:
Сообщений: 420

Пытаемся создать функцию типа
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
Member [заблокирован]

Откуда:
Сообщений: 420

Nailbomb
в функциях инсерты делать нельзя

Это они не доработали, или скорее переработали…

Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36928

Multy
Nailbomb
в функциях инсерты делать нельзя

Это они не доработали, или скорее переработали…

Да нет, это просто кто-то хелп не дочитал.

Козьма Прутков
Member

Откуда: Москва
Сообщений: 186

Multy,

а точно надо писать dbo.Rez а не @Rez1? В результирующую таблицу инсенртить можно, а в остальные — нет.

Create FUNCTION dbo.Ins
(
@Pr1 Int,
@Pr2 Int
)
RETURNS @Rez1 TABLE
(
Rez1 Int,
Rez2 Int
)
AS
BEGIN
insert into @Rez1(Rez1,Rez2) Values(@Pr1,@Pr2)
insert into @Rez1 Values(1,1)
RETURN
END

Multy
Member [заблокирован]

Откуда:
Сообщений: 420

Козьма Прутков
Multy,

а точно надо писать dbo.Rez а не @Rez1? В результирующую таблицу инсенртить можно, а в остальные — нет.

Create FUNCTION dbo.Ins
(
@Pr1 Int,
@Pr2 Int
)
RETURNS @Rez1 TABLE
(
Rez1 Int,
Rez2 Int
)
AS
BEGIN
insert into Rez1(Rez1,Rez2) Values(@Pr1,@Pr2)
insert into @Rez1 Values(1,1)
RETURN
END

В результирующию то понятно, смысл был как раз в побочную таблицу.
Канешна побочные действия функции считается плохой стиль, но вот бывает, что надо.
Попробуем процедуры.

Козьма Прутков
Member

Откуда: Москва
Сообщений: 186

Multy, а что за задача такая, при которой надо что-то менять в обычных таблицах? Уж не генератор ли каких номеров, или упаси бог ключей, вы пытаетесь написать?

проходящий.

Guest

Multy
Канешна побочные действия функции считается плохой стиль, но вот бывает, что надо.

И есть достаточное обоснование такой надобности? Можно его глянуть?

Пятница_13

Guest

Козьма Прутков,
А вот тут подробнее ! Про ключи особенно.

Aleksey-K
Member

Откуда: Москва
Сообщений: 3116

Козьма Прутков
Multy,

а точно надо писать dbo.Rez а не @Rez1? В результирующую таблицу инсенртить можно, а в остальные — нет.

Это не совсем верная информация.
Вы можете в функции создавать переменные типа таблица ( DECLARE @MyTable (…. ) ) и писать в них.
С уважением, Алексей

Козьма Прутков
Member

Откуда: Москва
Сообщений: 186

Aleksey-K, ладно уж придираться-то, я оперирую в терминах вопроса, а не пытаюсь пересказать BOL 🙂

Козьма Прутков
Member

Откуда: Москва
Сообщений: 186

Пятница_13
Козьма Прутков,
А вот тут подробнее ! Про ключи особенно.

Даже не знаю, что ответить. Может, лучше вопрос переформулировать?

Есть просто любители писать генераторы ключей, 99% которых просто не знают, как воспользоваться уже имеющимися возможностями MSSQL, или возможностями технологии разработки кода, который работает с БД. Поскольку любителей таких много — потому сразу и спрашиваю.

Пятница_13

Guest

Козьма Прутков
Пятница_13
Козьма Прутков,
А вот тут подробнее ! Про ключи особенно.

Даже не знаю, что ответить. Может, лучше вопрос переформулировать?

Есть просто любители писать генераторы ключей, 99% которых просто не знают, как воспользоваться уже имеющимися возможностями MSSQL, или возможностями технологии разработки кода, который работает с БД. Поскольку любителей таких много — потому сразу и спрашиваю.

Да, надо признать — я один из тех. А может просто привычка после Firebird-а и Oracle-а.
Буду признателен если разъясните какие возможности есть в MSSQL, дабы не изменять привычкам и не в ущерб производительности.

Козьма Прутков
Member

Откуда: Москва
Сообщений: 186

Пятница_13, не вижу смысла своими словами рассказывать, почитайте в BOL про identity, @@identity, scope_identity(). А также uniqueidentifier, newid() если хочется глобальной уникальности при невысокой производительности. Будут конкретные вопросы — задавайте уже их.

Пятница_13

Guest

Козьма Прутков,

Предлагаете изменить привычкам ?
В качестве генераторов попробовал использовать несколько таблиц с автоинкриментными полями, для получения нового значения просто добавлял запись и получал с помощью SCOPE_IDENTITY в ХП. Результат вроде приемлемый , но все же как-то не красиво …

Glory
Member

Откуда:
Сообщений: 104760

Пятница_13
Козьма Прутков,

Предлагаете изменить привычкам ?
В качестве генераторов попробовал использовать несколько таблиц с автоинкриментными полями, для получения нового значения просто добавлял запись и получал с помощью SCOPE_IDENTITY в ХП. Результат вроде приемлемый , но все же как-то не красиво …

Непривычно == некрасиво ? Красивость мереется по длине кода ?

Пятница_13

Guest

Glory
Пятница_13
Козьма Прутков,

Предлагаете изменить привычкам ?
В качестве генераторов попробовал использовать несколько таблиц с автоинкриментными полями, для получения нового значения просто добавлял запись и получал с помощью SCOPE_IDENTITY в ХП. Результат вроде приемлемый , но все же как-то не красиво …

Непривычно == некрасиво ? Красивость мереется по длине кода ?

В т.ч. и по длине кода ))
Но главное — производительность.
Вот и решил спросить совета. Может такой подход имеет право на жизнь ? )

Источник


Евгений

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 и нажмите «Готово», затем — «Продолжить обновление». Дождитесь окончания обновления и на вопрос «Обновить базу данных» ответьте «Да», «Принять». 
Полсе обновления информационной базы конфигуратор можно закрывать и открывать базу в режиме предприятия. Дальнейшая работа может выполняться в обычном режиме.»

Источник

Читайте также:  Побочные действия от кромогексал