2017-08-21 9 views
0

私はSQL Server 2008 R2 Enterpriseで作業しており、提供されたユーザー名のSQLパスワードを自動的に変更するパスワードジェネレータに取り組んでいます。私は別の場所でスクリプトを見つけて少し修正しました。私が持っている問題は、スクリプトを実行するとエラーが出るということです。以下はコードで、後はエラーです。パスワードの変更に関する動的なSQL構文の問題

set nocount on 

declare @PASSWORD_MIN_LENGTH int 
declare @PASSWORD_MAX_LENGTH int 
declare @LOGIN   SYSNAME 

select @PASSWORD_MIN_LENGTH = 25 
select @PASSWORD_MAX_LENGTH = 25 
select @LOGIN = 'Test_User' 

declare @PASSWORD_DATA table (PASSWORD_CHAR VARCHAR(1)) 
declare @NUM table (DIGIT int not null primary key clustered) 

insert into @NUM (DIGIT) 
    select DIGIT = 0 union all select DIGIT = 1 union all 
    select DIGIT = 2 union all select DIGIT = 3 union all 
    select DIGIT = 4 union all select DIGIT = 5 union all 
    select DIGIT = 6 union all select DIGIT = 7 union all 
    select DIGIT = 8 union all select DIGIT = 9 
    order by 1 

insert into @PASSWORD_DATA (PASSWORD_CHAR) 
select 
    PASSWORD_CHAR = 
    substring(b.CHARACTERS,a.RAND_INT%b.MOD,1) 
from 
    (select 
     aa.NUMBER, 
     RAND_INT = abs(convert(int, convert(varbinary(100), newid()))) 
    from 
     (select 
       NUMBER = a.DIGIT+(b.DIGIT*10) 
      from 
       @NUM a  
      cross join 
       @NUM b) aa 
) a 
cross join 
    (select 
     MOD = len(bb.CHARACTERS)-1, 
     bb.CHARACTERS 
    from 
     (select 
       CHARACTERS = 'ABCDEFGHJKLMNPQURSUVWXYZ' + 
          'abcdefghjkmnpqursuvwxyz' + 
          'ABCDEFGHJKLMNPQURSUVWXYZ' + 
          'abcdefghjkmnpqursuvwxyz' + 
          'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
          'abcdefghjkmnpqursuvwxyz' + 
          'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
          'abcdefghjkmnpqursuvwxyz' + 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '23456789'+ 
          '@#$^*+=<>?'+ 
          '@#$^*+=<>?'+ 
          '@#$^*+=<>?'+ 
          '@#$^*+=<>?') bb 
    ) b 
order by 
    newid() 

--select * from @PASSWORD_DATA 

declare @password varchar(100) 

select @password = '' 

select @password = @password+PASSWORD_CHAR 
from @PASSWORD_DATA 

select @password = 
    -- Random length from MIN to MAX characters 
    substring(@password,1, 
    @PASSWORD_MIN_LENGTH + 
    (abs(convert(int,convert(varbinary(100),newid()))))%(@PASSWORD_MAX_LENGTH [email protected]_MIN_LENGTH+1)) 

print 
' 

PASSWORD = '[email protected]+' 


exec master.dbo.sp_password 
    @old = NULL , 
    @new = '''[email protected]+''', 
    @loginame = '''+isnull(@LOGIN,'''')+''' 

    ' 

    exec master.dbo.sp_password 
    @old = NULL , 
    @new = '''[email protected]+''', 
    @loginame = '''+isnull(@LOGIN,'''')+''' 

exec master.dbo.sp_password実行後、次のエラーが表示されます。

メッセージ15007、レベル16、状態1、プロシージャsp_passwordを、ライン142
'' + ISNULL(@LOGIN、 '')+ '' は有効なログインではないか、権限がありません。

これはストアドプロシージャに変えて、SQLパスワードを自動的に生成して変更するように求められています。どんな助けもありがとう。 PS。私はボックスのSys Adminです。

+0

サイドノートを:あなたは** **あなたのために 'sp_'接頭辞を使用しないでくださいストアドプロシージャ。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

答えて

1

することは、このようにそれを試してみてください:

IF @LOGIN IS NOT NULL 
exec master.dbo.sp_password 
@old = NULL , 
@new = @password, 
@loginame = @LOGIN 
+0

それはまさにそれがかかったことです。とても有難い。 – bwilliamson

0

あなたには、いくつかの動的SQL必要がある場所。これは、ことがあります

set nocount on 
declare @PASSWORD_MIN_LENGTH int 
declare @PASSWORD_MAX_LENGTH int 
declare @LOGIN   SYSNAME 
select @PASSWORD_MIN_LENGTH = 25 
select @PASSWORD_MAX_LENGTH = 25 
select @LOGIN = 'Test_User' 

declare @PASSWORD_DATA table (PASSWORD_CHAR VARCHAR(1)) 
declare @NUM table (DIGIT int not null primary key clustered) 

---------------------------- 
DECLARE @TSQL NVARCHAR(4000); 
----------------------------- 

insert into @NUM (DIGIT) 
select DIGIT = 0 union all select DIGIT = 1 union all 
select DIGIT = 2 union all select DIGIT = 3 union all 
select DIGIT = 4 union all select DIGIT = 5 union all 
select DIGIT = 6 union all select DIGIT = 7 union all 
select DIGIT = 8 union all select DIGIT = 9 
order by 1 

insert into @PASSWORD_DATA (PASSWORD_CHAR) 
select 
    PASSWORD_CHAR = 
    substring(b.CHARACTERS,a.RAND_INT%b.MOD,1) 
from 
(
select 
    aa.NUMBER, 
    RAND_INT = 
    abs(convert(int,convert(varbinary(100),newid()))) 
from 
    (
    select 
     NUMBER = a.DIGIT+(b.DIGIT*10) 
    from 
     @NUM a cross join @NUM b 
    ) aa 
) a 
cross join 
(
select 
    MOD = len(bb.CHARACTERS)-1, 
    bb.CHARACTERS 
from 
    (
    select 
     CHARACTERS = 
     'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
     'abcdefghjkmnpqursuvwxyz'+ 
     'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
     'abcdefghjkmnpqursuvwxyz'+ 
     'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
     'abcdefghjkmnpqursuvwxyz'+ 
     'ABCDEFGHJKLMNPQURSUVWXYZ'+ 
     'abcdefghjkmnpqursuvwxyz'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '23456789'+ 
     '@#$^*+=<>?'+ 
     '@#$^*+=<>?'+ 
     '@#$^*+=<>?'+ 
     '@#$^*+=<>?' 
    ) bb 
) b 
order by 
    newid() 

--select * from @PASSWORD_DATA 

declare @password varchar(100) 

select @password = '' 

select @password = @password+PASSWORD_CHAR 
from @PASSWORD_DATA 

select @password = 
    -- Random length from MIN to MAX characters 
    substring(@password,1, 
    @PASSWORD_MIN_LENGTH + 
    (abs(convert(int,convert(varbinary(100),newid()))))%(@PASSWORD_MAX_LENGTH [email protected]_MIN_LENGTH+1)) 

print 
' 

PASSWORD = '[email protected]+' 


exec master.dbo.sp_password 
    @old = NULL , 
    @new = '''[email protected]+''', 
    @loginame = '''+isnull(@LOGIN,'''')+''' 

    ' 
---------------------------------------------- 
SELECT @TSQL = ' 
exec master.dbo.sp_password 
    @old = NULL , 
    @new = '''[email protected]+''', 
    @loginame = '''+isnull(@LOGIN,'''')+'''' 

EXECUTE sp_executesql @TSQL 
---------------------------------------------- 
関連する問題