我有一个 Delphi XE3 应用程序,它可以在 SQL Server 数据库中创建用户和登录名。我使用 FireDAC TAdConnection
、TADQuery
和两个 TAdScript
来执行 SQL 语句来创建用户和登录名。当我尝试在 SQL Server 上创建登录名时,用于创建登录名的 SQL 语句工作正常
CREATE LOGIN LOGIN_NAME
WITH PASSWORD='PASSWORD', CHECK_POLICY = OFF,
DEFAULT_DATABASE = DATABASE
但是当我尝试通过数据库创建用户时
CREATE USER USER_NAME
FOR LOGIN LOGIN_NAME WITH DEFAULT_SCHEMA=dbo
代码返回错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =,!=,<,<=,>,>= or when the subquery is used as an expression
我尝试使用 TAdConnection
、TAdQuery
和 TADScript
执行 SQL 语句,但它们都返回相同的错误。
你能帮忙吗?
更新1:感谢您的帮助和评论
这是我使用 SQL Server Management Studio 创建数据库用户时的结果
CREATE USER KDESAR12 FOR LOGIN KDESAR12
WITH DEFAULT_SCHEMA=dbo
结果
(1 row(s) affected)
用于获取数据库触发器的查询
select * from KACTUSDESARROLLO.sys.triggers where parent_class_desc = 'DATABASE'
返回 0 行
我的Delphi代码如下:
//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;
所有组件返回相同的错误
最佳答案
该语句导致该错误的唯一方法是 DDL 触发器。 EG
CREATE TRIGGER create_user_trigger
ON DATABASE
FOR create_user
AS
declare @id int = (select object_id from sys.objects);
;
go
关于sql-server - 在 SQL Server 中创建 USER 生成错误 : SUBQUERY RETURNED MORE THAN 1 VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44295816/