SQL Server使用触发器中插入的值创建登录
我在sql serevr 2012中有一个用户表,希望使用用户表上插入触发器的插入值创建相应的数据库登录用户 除了我不能在插入的表中正确使用引用值之外,一切似乎都正常 虽然我已经测试了该值以确保它存在 创建登录过程是否可能无法接受变量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;
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语句…对于所有的反馈…你们在这里摇滚。。