Задать вопрос
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, согласен что взаимодействие с базой через Django не уместно тут. Я что то уперся в это ...
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, использую, вот только принцип моделей мне не совсем подходит тут (вернее получение данных), у меня нет тематических таблиц. У меня множество предметных областей в рамках одной таблицы и поэтому мне проще самому писать sql чем использовать движок джанго. Я пробовал уже вытаскивать данные как по методичке .... не удобно.
    Всего 4 таблицы описывающие разные предметные области.
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, надо чтобы запрос выполнялся из под учетки sql которая связана с авторизованным пользователем.
    Логика действий:
    1. Есть пользователь в базе у него есть ник пароль входа и логин и пароль sql учетки.
    2. При прохождении аутентификации пользователь работает с базой через свою учетку sql выполняя инструкции из под этой цчетки.
  • Django mssql как выполнить чисты запрос в utf16?

    @saneok44 Автор вопроса
    Методом экспереметов в sql получлось разобраться что sql квстит значения к типу varchar из за чего cast к nvarchar был некорректен.

    Переписал declare и все отработало корректно

    def addLogError(errText: str, sqlText: str, parameters: str, functionname: str, username: str, appname: str):
        connection = None
    
        sql = (f'declare @v_errText nvarchar(max) = \'{errText}\';'
               f'declare @v_sqlText nvarchar(max) = \'{sqlText}\';'
               f'declare @v_parameters nvarchar(max) = \'{parameters}\';'
               f'declare @nv_fn nvarchar(max) = cast(\'{functionname}\' as nvarchar(max));'
               f'declare @nv_un nvarchar(max) = cast(\'{username}\' as nvarchar(max));'
               f'declare @nv_appname nvarchar(max) = cast(\'{appname}\' as nvarchar(max));'
               f''
               f'insert into LogErr([errText], [sqlText], [parameters], [functionname], [username], [AppName]) '
               f'VALUES('
               f'   cast(@v_errText as varbinary(max)), '
               f'   cast(@v_sqlText as varbinary(max)), '
               f'   cast(@v_parameters as varbinary(max)), '
               f'   @nv_fn, @nv_un, @nv_appname'
               f')')
    
        try:
            connection = django.db.connections['default']
            cursor = connection.cursor()
            cursor.execute(sql)
        except BaseException as e:
            print(e)
        finally:
            if connection:
                connection.close()
  • Не устанавливается Express, как исправить?

    @saneok44 Автор вопроса
    я 2017 ставил и 2022 ставил, да и к тому же как не поддерживается когда я только что поставил по своему методу!
    могу скрин скинуть, ноут Windows 11 Home
    659c349beb679884229184.png
  • Не устанавливается Express, как исправить?

    @saneok44 Автор вопроса
    Константин Цветков, у меня есть ноут на котором 1 ssd m2 на нем 1 раздел с виндой. Я спокойно на него поставил MS SQL Server ничего не меняя. На работе 1 SSD диск sata с 1 разделом на котором винда 11 и тоже все спокойно установилось. На компе стационарном 1 ssd m2 на 512 PCI 4.0 x4 на нем система Win11 pro, 1 ssd m2 1Gb PCI 3.0, и HDD. Ставлю на диск с системой и Ошибка при ожидании дескриптора восстановления ядра СУБД. Меняю при установки корневой каталог экземпляра на другой диск ssd m2 1Gb. И все установилось. Получается компоненты SQL на диске с виндой, а экземпляр на другом диске.
    Ошибку вызывает только развертывание ядра субд, компоненты то ставятся.
    ПС: Ставил и по дефолту и меняя учетные записи всегда была ошибка. Дело дошло даже до того что систему снес.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Kano, я не могу скинуть сюда листинг запросов. Так как первый запрос из 145 строк, мелки вообще длиной порядка 1-3 строк, последний на 500 строк. Могу сказать одно, первый запрос удаляет объект из тб1 и тб2, затем мелки запросы обращаются к тб1 и тб2 получают данные и передают запросу последнему, который может произвести удаление из тб1 и тб2 или просто изменить данные в тб2. И все это выполняется в транзакции на C#. И проблема была в том что когда первый запрос выполнил удаление, мелкие запросы пошли устанавливать свой коннект к базе для того чтобы получить данные из тб1 и тб2. Новый коннект устанавливался, но запрос вываливался по таймауту, а все это время висит открытая транзакция.
    Переписал так что мелкие методы могут создавать свое подключение или использовать уже установленное подключение и работать в составе транзакции. И проблема решена.

    PS: Я просто не представляю как вам это все скидывать вы с ума сойдете так как у меня все не так прозрачно написано как это на пабликах показывают. То что вы запросы увидите это вам ничего не даст, я их выполнял через ms sql studio одновременно, с задержкой и блокировок никаких не было. Повторюсь ... блокируется именно запрос выполняемый (не в режиме транзакции) на новом подключении во время активной транзакции, которая уже внесла изменения в таблицу. И все это под одним именем входа. Вываливается такой запрос по таймауту.
    Если я оберну мелкий запрос в свою транзакцию то это тоже решает проблему. Но я не хочу на мелкие запросы вешать собственную транзакцию, это не по назначению. Поэтому я включаю по необходимости мелкие запросы в состав транзакции и все. Уровни изоляции мне тут не нужны, мне нужна гарантия выполнения всех команд.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Переписал базовые класс и его методы на работу в режиме своего коннекта либо в режиме как часть транзакции. Протестил все работает.
    Более крупный класс унаследовал от базового класса с мелкими методами. В базовый класс объявил два свойства коннект и трансактион. Мелкие методы по этим свойствам определяют как им работать.

    В крупном классе в методе под using инициирую транзакцию и задаю всему классу режим транзакции передав в его свойства, которые он унаследовал от базового класса, SQLConnection и SQLTransaction теперь весь класс работает в режиме одной транзакции включая мелкие методы. По завершении блока using SQLConnection и SQLTransaction диспозятся тем самым переводя весь класс в режим обычный не транзакции.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Дополнение: Стал переписывать мелкие методы для двух режимов, собственный коннект или работа как часть транзакции.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Листинг мелкого метода:
    public DateTime getDatetimeValue(int ID, int propertyID)
            {
                string sql = "select dbo.getDatetimeValue(@ID, @propertyID)";
                DateTime result = new DateTime();
    
                using (SqlConnection con = new SqlConnection(stringConnect))
                {
                    SqlCommand com = new SqlCommand(sql, con);
                    com.Parameters.Add(new SqlParameter("@ID", ID));
                    com.Parameters.Add(new SqlParameter("@propertyID", propertyID));
    
                    try
                    {
                        con.Open();
                        object val = com.ExecuteScalar();
                        DateTime.TryParse(val.ToString(), out result);
                    }
                    catch (Exception e)
                    {
                        string stack = e.StackTrace;
                        string msg = e.Message;
                        string method = "getDatetimeValue";
                        string param = "ID=" + ID + "; propertyID=" + propertyID + ";";
    
                        addlogErr(WebConfigurationManager.AppSettings["AppName"], method, param, msg, stack);
                        Debug.WriteLine(formaExceptionMsg(method, param, msg, stack));
    
                        if (interceptException)
                            throw new Exception(method, e);
                    }
                    finally
                    {
                        con.Close();
                    }
                }
    
                return result;
            }


    Краткий листинг крупного метода инициирующего транзакцию: (черновой не критиковать что нет using-ов)))
    public void RemoveAndGlue(int userID, int periodID)
            {
               //.....
    
                SqlConnection connection = new SqlConnection(ark.stringConnect);
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    
                try
                {
                    ModelPeriod model = GetPeriod(periodID);
                    if (model == null) throw new Exception("Ошибка операции");
    
                    List<int> items = GetFriends(periodID);
    
                    SqlCommand command1 = _Delete(userID, periodID);
                    command1.CommandTimeout = 60;
                    command1.Connection = connection;
                    command1.Transaction = transaction;
                    command1.ExecuteNonQuery();
    
                    ModelPeriod uPeriod = null;
                    if (items[0] > 0 && items[2] > 0)
                    {
                        DateTime dateEnd = ark.getDatetimeValue(items[2], pid_dateBegin); //<-- вываливается по таймауту
                        dateEnd = dateEnd.AddDays(-1);
                        uPeriod = new ModelPeriod();
                        uPeriod.PeriodID = items[0];
                        uPeriod.DateBegin = ark.getDatetimeValue(items[0], pid_dateBegin); //<-- вываливается по таймауту
                        uPeriod.DateEnd = dateEnd;
                    }
                    else if (items[0] > 0 && items[2] <= 0 && (status == pid_active || status == pid_expired))
                    {
                        DateTime dateEnd = ark.getDatetimeValue(items[0], pid_dateEnd); //<-- вываливается по таймауту
                        ark.setDatetimeValue(contractId, pid_c_dateEnd, dateEnd); //<-- вываливается по таймауту
                    }
                    else if (items[0] <= 0 && items[2] > 0)
                    {
                        DateTime dateBegin = ark.getDatetimeValue(contractId, pid_c_dateBegin); //<-- вываливается по таймауту
                        uPeriod = new ModelPeriod();
                        uPeriod.PeriodID = items[2];
                        uPeriod.DateBegin = dateBegin;
                        uPeriod.DateEnd = ark.getDatetimeValue(items[2], pid_dateEnd); //<-- вываливается по таймауту
                    }
    
                    if (uPeriod != null)
                    {
                        SqlCommand command2 = Command_UpdateCascadePeriod(userID, uPeriod);
                        command2.CommandTimeout = 60;
                        command2.Connection = connection;
                        command2.Transaction = transaction;
                        command2.ExecuteNonQuery();
                    }
    
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw new Exception(ex.Message);
                }
                finally
                {
                    connection.Close();
                }
            }
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Да я также думаю, передавать в мелкие методы транзакции благо они у меня как базовые методы взаимодействия с базой. Буду наследовать класс с мелкими методами для класса с крупными и передавая или задавая транзакцию для крупного метода мелкие методы будут выбирать альтернативное подключение как транзакция.
    Протестил разные варианты:
    Оказывается нет блокировки таблицы, блокировка идет как то на уровне библиотеки. Кака я это понял:
    Стартанул проект и сделал два подключения к сайту через два разных браузера и учетки. Одна учетка дернула метод с транзакцией которая эмулировала долгую транзакцию, а вторая учетка сделала запрос к таблице и никакой блокировки. Даже если я в двух браузерах авторизуюсь под одной учеткой sql тоже нет блокировки тб.
    Блокировка идет только из текущего запущенного потока подключения пользователя. Т.е. если запущена транзакция в работе и до коммита идет метод по подключению к базе, то этот метод коннектится к базе но запрос по таймауту вываливается, и чтобы это избежать нужно этот запрос включить в транзакцию. Заметил еще что это блокировка срабатывает когда были внесены изменения и эта блокировка распространяется только на текущий поток приложения. И такое ощущение что это не на уровне ядра блокировка ...
    P.S. Повторюсь мелкие методы у меня подключаются не по ACID а обычным способом.
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Спасибо за совет, сегодня провели анализ нагрузки и пришли к выводу, что из за роста объема данных некоторые тяжеловесные запросы стали нагружать sql. Пришли к выводу , что надо пытаться оптимизировать некоторые запросы и минимизировать запросы со стороны клиента когда данные ему вообщем то не нужны и грузить их лишний раз не стоит.

    На счет уникально ID запроса ... тут я не знаю как прокомментировать. У нас в sql есть учетные данные входа по котором пользователь авторизуется и работает с базой, есть так же дефолтная учетка для неавторизованных пользователей. Все веб приложения используют учетные данные входа и тут я думаю нужно наверное какой то уникальный ID делать в связке приложение + учетка sql. Может это уже под капотом есть IIS + SQL пока не могу сказать. Не давать стакать запросы пока не завершиться первый ... ну это так бешенная идея
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Akina, На уровне интерфейса это нереально. Заблокировать web интерфейс? Пользователь обновит страницу и повторит. Один вариант крутится в голове это сделать свой планировщик, но это геморно втискивать его уже в работающую систему.

    Вы правильно сказали все, куча разрозненных операций, неконтролируемых sql. Весь контроль идет на бекенде (в коде) не в транзакциях
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Akina, это вы говорите про полную транзакцию, которая проверяет и создает объект в одной транзакции. У нас все операции разбиты на мелкие транзакции. Транзакция на проверку, транзакция на запись, транзакция. Т.е. например таблица обджект обладает 5 поляуми. Объект заполняется не одним запросом, а мелкими. Например чтобы создать тело объекта, я проверю некоторое условие в базе, потом отправлю трнзакцию на создание объекта т.е. выдам ему ID потом имея ID создам в таблице Свойств уникальную пару ID, СВойство ID, и запишу например число. Как буд то вы работает с ООП. Мелкие запросы. Вот тут и возникает параллельный доступ к данным и коллизии.
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    есть главный объект (узел) у него дочернии объекты со своими свойствами. Свойства уникальны в пределах объекта. Т.е. уникальность на уровне свойств имеется. Уникальность у объекта только по id. Из за подвисуна может создасться два таких объекта. Потому что пользователь не дождался предыдущей транзакции, обновил страницу и нажал создать снова
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    res2001, но у нас уникальность на уровне свойств объекта. От создания самого объекта это не спасет
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Akina, но у нас уникальность на уровне свойств объекта. От создания самого объекта это не спасет
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Да так и есть. Это спасло. Но хотелось бы больше контроля над такими ситуациями
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    У нас было раньше два сервера. Один из которых был старый и на нем были некоторые ресурсозатратные операции. Как то жили и вытягивали. Потом по определенным причинам, пришлось объединить базы на один сервер. И при разовой высокой нагрузке по расчету годовому, стали наблюдаться как раз таки проблемы. Что транзакция стала подвисать, а пользователь он такой неудержимый. Обновляет страницу и и снова создает запрос на создание объекта из за чего появляется ошибка по уникальному ключу