Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с SQL-запросом при создании пользователя в Delphi XE3 и SQL Server

Delphi , Базы данных , SQL

Пользователь столкнулся с проблемой при выполнении SQL-запроса на создание пользователя в базе данных SQL Server через приложение на Delphi XE3. Ошибка, с которой он столкнулся, указывала на то, что подзапрос возвращает более одного значения, что недопустимо в данном контексте. Давайте разберемся, в чем может быть проблема и как ее можно решить.

Описание проблемы

При попытке создания пользователя в SQL Server с помощью приложения на Delphi XE3, использующего компоненты FireDAC, такие как TAdConnection, TADQuery и TAdScript, возникает ошибка "Subquery returned more than 1 value". Это происходит при выполнении следующего SQL-запроса:

CREATE USER USER_NAME
FOR LOGIN LOGIN_NAME WITH DEFAULT_SCHEMA=dbo

Запрос на создание логина работает корректно:

CREATE LOGIN LOGIN_NAME
WITH PASSWORD='PASSWORD', CHECK_POLICY = OFF,
DEFAULT_DATABASE = DATABASE

Проблема возникает при использовании всех трех компонентов FireDAC, и ошибка остается неизменной.

Возможные причины и решения

Проверка в SQL Server Management Studio

Первым шагом было бы проверить, возникает ли ошибка при выполнении запроса в SQL Server Management Studio. Если ошибка не возникает, это указывает на проблему в коде Delphi.

Проверка триггеров базы данных

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

SELECT * FROM sys.triggers WHERE parent_class_desc = 'DATABASE'

Пример кода на Object Pascal

Вот пример кода на Object Pascal, который можно использовать для выполнения SQL-запроса с помощью компонента TADQuery:

try
    lStSQL := 'CREATE USER KDESAR12 FOR LOGIN KDESAR12 WITH DEFAULT_SCHEMA=dbo;';
    ADQuery2.SQL.Add(lStSQL);
    ADQuery2.ExecSQL;
except on E: Exception do
    begin
        ShowMessage(E.Message);
    end;
end;

Используя TAdConnection, запрос выполняется аналогичным образом:

try
    lStSQL := 'CREATE USER KDESAR12 FOR LOGIN KDESAR12 WITH DEFAULT_SCHEMA=dbo;';
    ADConnection1.ExecSQL(lStSQL);
except on E: Exception do
    begin
        ShowMessage(E.Message);
    end;
end;

Проверка на наличие DDL-триггеров

Ошибка может быть вызвана DDL-триггером. Например, следующий код создает триггер, который может вызвать указанную ошибку:

CREATE TRIGGER create_user_trigger
ON DATABASE
FOR create_user
AS
    declare @id int = (select object_id from sys.objects);
GO

Проверка на наличие триггеров сервера

Также стоит проверить наличие триггеров на уровне сервера:

SELECT * FROM sys.server_triggers

Подтвержденное решение

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

Заключение

При работе с SQL Server и компонентами FireDAC в Delphi важно тщательно проверять конфигурацию базы данных и сервера, включая наличие триггеров, которые могут влиять на выполнение DDL-операций. В данном случае, после проверки и устранения проблемного триггера, проблема была решена.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с ошибкой при выполнении SQL-запроса на создание пользователя в базе данных SQL Server через Delphi XE3, связанной с подзапросом, возвращающим более одного значения, что является недопустимым в данном контексте использования, и пр


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 13:50:00/0.003680944442749/1