ورود

View Full Version : کل Stored Procedure ها را یکجا با دستور WITH ENCRYPTION رمز کرد



rahele_sa
سه شنبه 18 دی 1386, 17:38 عصر
یکی یکی SP ها را با دستور WITH ENCRYPTION رمز کردن را بلدم ولی همه را با هم نه

ممنون میشم اگه کسی کمکم کنه

حمیدرضاصادقیان
سه شنبه 18 دی 1386, 20:21 عصر
فکر کنم تنها راه نوشتن یک برنامه هست اونم روی جدول sysobjects یک select بزنی و نام تمامی sp های جدولت رو در بیاری و در یک حلقه تمامی sp ها با دستور Alter عبارت with encryption قرار بدی.

rahele_sa
سه شنبه 18 دی 1386, 22:12 عصر
این روش خوبی است اما تو این روش واسه Alter زدن احتیاج به کد خود sp هم است !

mdrd
چهارشنبه 19 دی 1386, 10:20 صبح
دو تا کار میتونی بکنی ولی قبلش "حتــــــــــــما" از sp هات backup بگیر
1- همه sp ها رو تو یه فایل قرار بده بعد با notepad باز کن یه replace all بکن به صورت
AS

Change it to:

WITH ENCRYPTION
AS

2- از cursor و جدول sysobject استفاده کنی (این خودش یک sp میخواد) این یکی یه خورده خطرناکه

CREATE PROCEDURE encryptAll AS
DECLARE @current_proc varchar(255),
@current_text varchar(8000),
@cmd varchar(255)
SET NOCOUNT ON
DECLARE _Cursor CURSOR FOR
SELECT o.name,c.text
FROM sysobjects o
INNER JOIN syscomments c ON c.id = o.id
WHERE o.type='p' and o.category=0 and o.name<>'encryptAll'
and encrypted=0

OPEN _Cursor
FETCH NEXT FROM _Cursor
INTO @current_proc, @current_text
WHILE @@FETCH_STATUS = 0
BEGIN

PRINT ''
PRINT '--Encrypting: ' + @current_proc
PRINT ''

SET @cmd = 'drop procedure ' + @current_proc
EXEC( @cmd)

SET @cmd = replace(@current_text, 'CREATE PROCEDURE ' + @current_proc, 'CREATE PROCEDURE ' + @current_proc + ' WITH ENCRYPTION')
PRINT @cmd
EXEC( @cmd)
FETCH NEXT FROM _Cursor INTO @current_proc, @current_text
END
CLOSE _Cursor
DEALLOCATE _Cursor

PRINT ''
PRINT '--Encrpytion Process Complete'

GO

rahele_sa
پنج شنبه 20 دی 1386, 00:04 صبح
CREATE PROCEDURE EncryptAll_SP
AS
BEGIN
SET NOCOUNT ON

DECLARE
@current_proc varchar(255),
@current_text varchar(8000),
@cmd varchar(255)

DECLARE _Cursor CURSOR
FOR
SELECT o.name,c.text FROM sysobjects o
INNER JOIN syscomments c ON c.id = o.id
WHERE o.type='P' and o.category=0 and o.name<>'EncryptAll_SP' and encrypted=0

OPEN _Cursor
FETCH NEXT FROM _Cursor INTO @current_proc, @current_text
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ''
PRINT '--Encrypting: ' + @current_proc
PRINT ''

SET @cmd = 'drop procedure ' + @current_proc
EXEC( @cmd)

SET @cmd = replace(@current_text, 'CREATE PROCEDURE [' + @current_proc + ']', 'CREATE PROCEDURE [' + @current_proc + '] WITH ENCRYPTION')
PRINT @cmd
EXEC( @cmd)
FETCH NEXT FROM _Cursor INTO @current_proc, @current_text
END
CLOSE _Cursor
DEALLOCATE _Cursor

PRINT ''
PRINT '--Encrpytion Process Complete'
END

GO

rahele_sa
پنج شنبه 20 دی 1386, 00:40 صبح
دستور WITH ENCRYPTION یک مشکل خیلی بدی که داره اینه که اگر SP شما پارامتر ورودی داشته باشه خطا میده

به طور مثال این کد مشکلی نداره


CREATE PROCEDURE A1_SP WITH ENCRYPTION
AS
BEGIN
SELECT * FROM Users_T
END

اما این کد مشکل داره و خطا میدهد


CREATE PROCEDURE A1_SP WITH ENCRYPTION
@UserID int
AS
BEGIN
SELECT * FROM Users_T
END

اینم متن خطاشه



Msg 102, Level 15, State 1, Procedure A1_SP, Line 2
Incorrect syntax near '@UserID'.

حمیدرضاصادقیان
پنج شنبه 20 دی 1386, 09:09 صبح
خوب دوست عزیز With Encryption باید بعد از تمامی پارامترها بیاد.

rahele_sa
پنج شنبه 20 دی 1386, 21:35 عصر
ممنون آقای حمیدرضا صادقیان


CREATE PROCEDURE A1_SP
@UserID int ,
@UserName nvarchar(50)WITH ENCRYPTION
AS
BEGIN
SELECT * FROM Users_T
END

rahele_sa
پنج شنبه 20 دی 1386, 21:44 عصر
دو تا کار میتونی بکنی ولی قبلش "حتــــــــــــما" از sp هات backup بگیر
1- همه sp ها رو تو یه فایل قرار بده بعد با notepad باز کن یه replace all بکن به صورت
AS

Change it to:

WITH ENCRYPTION
AS

2- از cursor و جدول sysobject استفاده کنی (این خودش یک sp میخواد) این یکی یه خورده خطرناکه

CREATE PROCEDURE encryptAll AS
DECLARE @current_proc varchar(255),
@current_text varchar(8000),
@cmd varchar(255)
SET NOCOUNT ON
DECLARE _Cursor CURSOR FOR
SELECT o.name,c.text
FROM sysobjects o
INNER JOIN syscomments c ON c.id = o.id
WHERE o.type='p' and o.category=0 and o.name<>'encryptAll'
and encrypted=0

OPEN _Cursor
FETCH NEXT FROM _Cursor
INTO @current_proc, @current_text
WHILE @@FETCH_STATUS = 0
BEGIN

PRINT ''
PRINT '--Encrypting: ' + @current_proc
PRINT ''

SET @cmd = 'drop procedure ' + @current_proc
EXEC( @cmd)

SET @cmd = replace(@current_text, 'CREATE PROCEDURE ' + @current_proc, 'CREATE PROCEDURE ' + @current_proc + ' WITH ENCRYPTION')
PRINT @cmd
EXEC( @cmd)
FETCH NEXT FROM _Cursor INTO @current_proc, @current_text
END
CLOSE _Cursor
DEALLOCATE _Cursor

PRINT ''
PRINT '--Encrpytion Process Complete'

GO

روش اول را که گفتید خوبه اما مشکلی که داره اینه که AS فقط انتهای پارامترهای SP نیست
ممکن است از توابعی مثل این هم استفاده شده باشد


CAST('123' AS int)

این یکی رو چیکار کنم

حمیدرضاصادقیان
پنج شنبه 20 دی 1386, 22:46 عصر
فکر کنم میتونی داخل word اینکارو کنی و تک تک replace کنی یعنی برای هر replace ازت سوال کنه و replace all رو نزنی . با این روش فکر کنم بتونی انجام بدی.

rahele_sa
پنج شنبه 20 دی 1386, 23:15 عصر
بله
مثل اینکه بهترین روش همین است .