Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server使用触发器中插入的值创建登录_Sql_Sql Server - Fatal编程技术网

SQL Server使用触发器中插入的值创建登录

SQL Server使用触发器中插入的值创建登录,sql,sql-server,Sql,Sql Server,我在sql serevr 2012中有一个用户表,希望使用用户表上插入触发器的插入值创建相应的数据库登录用户 除了我不能在插入的表中正确使用引用值之外,一切似乎都正常 虽然我已经测试了该值以确保它存在 创建登录过程是否可能无法接受变量 ALTER TRIGGER [dbo].[addsyslogin] ON [dbo].[Users] FOR INSERT AS BEGIN SET NOCOUNT ON; SET QUOTED_IDENTIFIER OFF;

我在sql serevr 2012中有一个用户表,希望使用用户表上插入触发器的插入值创建相应的数据库登录用户

除了我不能在插入的表中正确使用引用值之外,一切似乎都正常 虽然我已经测试了该值以确保它存在

创建登录过程是否可能无法接受变量

ALTER TRIGGER [dbo].[addsyslogin] 
   ON [dbo].[Users]
   FOR  INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    SET QUOTED_IDENTIFIER OFF;

    Declare @u varchar(10);
    SELECT @u=i.userid from inserted i;


    print @u;

CREATE LOGIN [@u] WITH PASSWORD='water123GH', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON


END
我已经研究了引用的标识符,但我仍然有这个问题

所发生的情况是,实际创建的数据库用户的userid=@u而不是@u中的值

感谢您的注释和反馈

尝试以下方法:

SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON';
EXECUTE(@SQL);

这是一件奇怪的事情,但你需要

  • 允许多行
  • 升级权限
  • 使用动态SQL
其他说明:

  • 我建议您在master中需要一个由触发器调用的单独存储过程来处理升级
  • 如果您不需要升级,那么您的权限太高
粗略代码:

ALTER TRIGGER [dbo].[addsyslogin] ON [dbo].[Users] FOR  INSERT
WITH EXECUTE AS --soemthing
AS 
SET NOCOUNT ON;

Declare @u varchar(10), @uid int;

SELECT TOP 1 @uid = i.userid, @u = i.userid
FROM inserted i
ORDER BY i.userid;

WHILE @u IS NOT NULL
BEGIN
    SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON';

    EXECUTE(@SQL);

    SET @u = NULL;

    SELECT TOP 1 @uid = i.userid, @u = i.userid
    FROM inserted i
    WHERE i.userid > @uid
    ORDER BY i.userid;

 END

 GO

触发器必须作为注释处理多行-如果插入2个用户,触发器将只触发一次,但插入的表将包含2行。你的代码不需要这个。顺便说一句,你不能在CREATE LOGIN语句中使用这样的参数…我每次都从asp.net mvc页面插入用户。只插入一个。我已经测试过了,效果很好。问题是@u中的值似乎没有存储用户id。在我看来,这是一个编程错误,但无法理解它是什么…这意味着创建登录不能接受变量?对于触发器中的登录名Dynamic SQL!你真的要下地狱了!但是userid是用一个sql参数值“drop database water”创建的:pkinda同意,但这将解决他的问题。我不会在触发器上创建登录,但我们不知道他的真实情况。也许出于某种令人毛骨悚然的原因,这是他唯一的可能性。我正在尝试…将带着反馈回来..没有令人毛骨悚然的原因..只是为了确保创建的数据库用户在数据库表中创建成功后立即生效..我在实体框架中处理此问题时也遇到问题..这就是为什么我选择这种方式…我不是专家sql的家伙…谢谢迭戈…我太笨了…我扣动了扳机,使用了sql语句…对于所有的反馈…你们在这里摇滚。。