2017-05-31 2 views
2

J'ai une application Delphi XE3 qui crée des utilisateurs et des connexions dans une base de données SQL Server. J'ai utilisé FireDAC TAdConnection, TADQuery et deux TAdScript pour exécuter des instructions SQL pour créer les utilisateurs et les connexions. Lorsque je tente de créer connexion sur SQL Server, l'instruction SQL pour créer des connexions fonctionne très bienCréer un utilisateur dans SQL Server génère une erreur: SUBQUERY RETURNED PLUS DE 1 VALEUR

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

Mais lorsque je tente de créer l'utilisateur sur la base de données

CREATE USER USER_NAME 
FOR LOGIN LOGIN_NAME WITH DEFAULT_SCHEMA=dbo 

le code renvoie une erreur:

Subquery returned more than 1 value. This is not permitted when the subquery follows =,!=,<,<=,>,>= or when the subquery is used as an expression

J'ai essayé d'exécuter l'instruction SQL en utilisant TAdConnection, TAdQuery et TADScript, mais tous les retourne la même erreur.

Pourriez-vous m'aider s'il vous plait?

MISE À JOUR 1: Merci pour votre aide et commentaires

Ceci est le résultat lorsque j'utilise SQL Server Management Studio pour la création de la base de données USER

CREATE USER KDESAR12 FOR LOGIN KDESAR12 
WITH DEFAULT_SCHEMA=dbo 

Résultat

(1 row(s) affected)

La requête utilisée pour obtenir le déclencheur de la base de données

select * from KACTUSDESARROLLO.sys.triggers where parent_class_desc = 'DATABASE' 

Renvoie 0 lignes

Mon code Delphi est comme suit:

//Using TADScript 
    try 
    lStSQL := 'SET CMDSEP ;'; 
    lStSQL := lStSQL + ' USE MY_DATABASE_NAME; '; 

    lStSQL := lStSQL + ' CREATE USER KDESAR12 FOR LOGIN KDESAR12 WITH DEFAULT_SCHEMA=dbo;'; 

    ADScript1.SQLScripts.Add.SQL.Text := lStSQL; 
    ADScript1.ValidateAll; 
    ADScript1.ExecuteAll; 

    except on E: exception do 
    begin 
     ShowMessage(E.Message); 
    end; 
    end; 

//Using 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; 

//Using 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; 

Tous les composants retourne la même erreur

+0

Avez-vous essayé cette instruction sur le SQL Server Studio de gestion? Vous serez en mesure d'affiner les possibilités, en déterminant si le problème réside dans les composants ADO, ou votre base de données eux-mêmes. –

+1

"select * from sys.triggers où parent_class_desc = 'MY_DATABASE_NAME'" est incorrect. Devrait être "select * from MY_DATABASE_NAME.sys.déclenche où parent_class_desc = 'Database' " –

+0

merci @ DavidBrowne Microsoft renvoie 0 lignes trop ' select * from KACTUSDESARROLLO.sys.triggers où parent_class_desc = « DATABASE'' –

Répondre

3

La seule façon cette déclaration peut provoquer cette erreur est un déclencheur DDL. EG

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

David Browne merci, je vérifie que, mais la base de données doesn Ne pas déclencher ... –

+1

Erik, est-ce la même chose si vous exécutez ces commandes à partir du studio de gestion? Si non, pourriez-vous fournir votre code Delphi? – Victoria

+1

Exécutez le code, s'il vous plaît: sélectionnez * de sys.triggers où parent_class_desc = 'DATABASE' – sepupic

0

Merci à tous pour votre aide. J'ai fini de tester le code par rapport à une autre base de données dans un autre serveur, et cela a très bien créé la connexion. J'ai donc demandé à l'administrateur de base de données les différences entre ces environnements, et il m'a indiqué un déclencheur de serveur qu'il utilisait à des fins d'audit. Une fois qu'il l'a désactivé sur le premier serveur, le code a fonctionné comme prévu.

Pour la postérité, en plus de la vérification des triggers comme Browne @ David - Microsoft a déclaré, on peut vérifier pour le serveur déclenche comme ceci:

SELECT * FROM sys.server_triggers 

merci encore

+1

Donc, il ne pouvait pas travailler avec le studio de gestion alors. – Victoria