【发布时间】:2017-05-31 22:44:54
【问题描述】:
我有一个 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
代码返回错误:
子查询返回超过 1 个值。当子查询跟随 =,!=,,>= 或子查询用作表达式时,这是不允许的
我尝试使用TAdConnection、TAdQuery 和TADScript 执行SQL 语句,但它们都返回相同的错误。
你能帮忙吗?
更新 1:感谢您的帮助和 cmets
这是我使用 SQL Server Management Studio 创建数据库用户时的结果
CREATE USER KDESAR12 FOR LOGIN KDESAR12
WITH DEFAULT_SCHEMA=dbo
结果
(受影响的 1 行)
用于获取数据库触发器的查询
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;
所有组件都返回相同的错误
【问题讨论】:
-
您是否在 SQL Server Management Studio 上尝试过该指令?您将能够缩小可能性,确定问题出在 ADO 组件中,还是您的数据库本身。
-
"select * from sys.triggers where parent_class_desc = 'MY_DATABASE_NAME'" 不正确。应该是“select * from MY_DATABASE_NAME.sys.triggers where parent_class_desc = 'DATABASE'”
-
感谢 @DavidBrowne-Microsoft 它也返回 0 行
select * from KACTUSDESARROLLO.sys.triggers where parent_class_desc = 'DATABASE'
标签: sql-server delphi firedac