1

我在 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

我研究了quoted_identifiers,但我仍然有这个问题。

实际情况是,数据库用户实际上是使用 userid=@u 而不是 @u 中的值创建的。

感谢您的笔记和反馈

4

2 回答 2

0

尝试这个:

SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON';
EXECUTE(@SQL);
于 2012-04-12T09:57:57.073 回答
0

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

  • 允许多行
  • 提升权限
  • 使用动态 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
于 2012-04-12T10:05:15.743 回答