sql-server - 在 SQL Server 中创建 USER 生成错误 : SUBQUERY RETURNED MORE THAN 1 VALUE

标签 sql-server delphi firedac

我有一个 Delphi XE3 应用程序,它可以在 SQL Server 数据库中创建用户和登录名。我使用 FireDAC TAdConnectionTADQuery 和两个 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

我尝试使用 TAdConnectionTAdQueryTADScript 执行 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/

相关文章:

javascript - 我可以使用javascript调用delphi xe8 REST服务post吗?

sqlite - 如何使用 FireDAC TFDConnection 迭代表、字段和字段定义

sql - 如何重用公共(public)表表达式

字符串 := const : why different implementation for local and result?

sql-server - 在delphi TadoConnection中隐藏内存中的连接用户密码

windows - 使用 Windows 资源管理器打开网络目录(包括使用 Delphi XE 制作的可执行文件)时流量较高

sql-server - 当 BCD 映射规则处于事件状态时,在 INSERT 查询中转换参数值会导致算术溢出

mysql - FireDac 错误 314 - 但 DLL 位于程序目录中

sql - 获取 2 个提供日期之间的所有年份

sql-server - t-sql语句语法错误