Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Расшифровка триггера в SQL 2008  [new]
Rusich2012
Member

Откуда:
Сообщений: 161
Здравствуйте!

Пытаюсь расшифровать триггеры, не получается. Выдает ошибку Incorrect syntax near 'AS'.
С хранимыми процедурами все ОК.

Вот код:
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[procDecryptObject] 
( 
	@Schema NVARCHAR(128)=N'dbo', 
	@ObjectName NVARCHAR(128)=N'myproc'
) AS
BEGIN

DECLARE @i INT
DECLARE @ObjectDataLength INT
DECLARE @ContentOfEncryptedObject NVARCHAR(MAX)
DECLARE @ContentOfDecryptedObject NVARCHAR(MAX)
DECLARE @ContentOfFakeObject NVARCHAR(MAX)
DECLARE @ContentOfFakeEncryptedObject NVARCHAR(MAX)
DECLARE @ObjectType NVARCHAR(128)
DECLARE @ObjectID INT
DECLARE @tablename varchar(255)

SET NOCOUNT ON

SET @ObjectID = OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']')

IF @ObjectID IS NULL
BEGIN
	RAISERROR('The object name or schema provided does not exist in the database', 16, 1)
	RETURN
END


IF NOT EXISTS(SELECT TOP 1 * FROM syscomments WHERE id = @ObjectID AND encrypted = 1)
BEGIN
	RAISERROR('The object provided exists however it is not encrypted. Aborting.', 16, 1)
	RETURN
END

IF OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']', 'PROCEDURE') IS NOT NULL
	SET @ObjectType = 'PROCEDURE'
ELSE
	IF OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']', 'TRIGGER') IS NOT NULL
		SET @ObjectType = 'TRIGGER'
	ELSE
		IF OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']', 'VIEW') IS NOT NULL
			SET @ObjectType = 'VIEW'
		ELSE
			SET @ObjectType = 'FUNCTION'


SELECT TOP 1 @ContentOfEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']')
        AND valclass = 1 and subobjid = 1

SET @ObjectDataLength = DATALENGTH(@ContentOfEncryptedObject)/2


 SET @tablename=(SELECT sysobjects_1.name
 FROM dbo.sysobjects INNER JOIN
  dbo.sysobjects sysobjects_1 ON dbo.sysobjects.parent_obj = sysobjects_1.id
 WHERE (dbo.sysobjects.type = 'TR') AND (dbo.sysobjects.name = @ObjectName) )

SET @ContentOfFakeObject = N'ALTER ' + @ObjectType + N' [' + @Schema + N'].[' + @ObjectName + N']'+ ' ON '+@tablename+' WITH ENCRYPTION AFTER UPDATE AS'

print @ContentOfFakeObject

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
        ELSE
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END

SET XACT_ABORT OFF
BEGIN TRAN

EXEC(@ContentOfFakeObject)

IF @@ERROR <> 0
        ROLLBACK TRAN

SELECT TOP 1 @ContentOfFakeEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @Schema + '].[' + @ObjectName + ']')
        AND valclass = 1 and subobjid = 1

IF @@TRANCOUNT > 0
        ROLLBACK TRAN

SET @ContentOfFakeObject = N'CREATE ' + @ObjectType + N' [' + @Schema + N'].[' + @ObjectName + N']'+ ' ON '+@tablename+' WITH ENCRYPTION AFTER UPDATE AS'


WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
        ELSE
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END


SET @i = 1

SET @ContentOfDecryptedObject = N''

WHILE DATALENGTH(@ContentOfDecryptedObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfDecryptedObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', 4000)
        ELSE
                SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', @ObjectDataLength - (DATALENGTH(@ContentOfDecryptedObject)/2))
END


WHILE @i <= @ObjectDataLength
BEGIN
        SET @ContentOfDecryptedObject = STUFF(@ContentOfDecryptedObject, @i, 1,
                NCHAR(
                        UNICODE(SUBSTRING(@ContentOfEncryptedObject, @i, 1)) ^
                        (
                                UNICODE(SUBSTRING(@ContentOfFakeObject, @i, 1)) ^
                                UNICODE(SUBSTRING(@ContentOfFakeEncryptedObject, @i, 1))
                        )))

        SET @i = @i + 1
END

PRINT(@ContentOfDecryptedObject)

END



Насколько я понял, проблема в двух строчках, неправильно составлен запрос:
SET @ContentOfFakeObject = N'ALTER ' + @ObjectType + N' [' + @Schema + N'].[' + @ObjectName + N']'+ ' ON '+@tablename+' WITH ENCRYPTION AFTER UPDATE AS'
SET @ContentOfFakeObject = N'CREATE ' + @ObjectType + N' [' + @Schema + N'].[' + @ObjectName + N']'+ ' ON '+@tablename+' WITH ENCRYPTION AFTER UPDATE AS'



Запускаю из cmd, с включенным DAC:
osql -S ADMIN:servTest -U sa -P password -d test -Q "exec procDecryptObject 'dbo','trtest'"

Подскажите ошибку, пожалуйста??
3 июл 13, 11:06    [14514949]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка триггера в SQL 2008  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
И что же должно выполниться тут?
SET @ContentOfFakeObject = N'ALTER ' + @ObjectType + N' [' + @Schema + N'].[' + @ObjectName + N']'+ ' ON '+@tablename+' WITH ENCRYPTION AFTER UPDATE AS'

print @ContentOfFakeObject

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
        IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
        ELSE
                SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END

SET XACT_ABORT OFF
BEGIN TRAN

EXEC(@ContentOfFakeObject)
3 июл 13, 16:52    [14517905]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка триггера в SQL 2008  [new]
Rusich2012
Member

Откуда:
Сообщений: 161
hoha_ftf, должен выполнится метод ALTER. Хочется понять, что нужно добавить.
4 июл 13, 10:11    [14520519]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка триггера в SQL 2008  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Rusich2012,

ну так, вы посмотрите, что там в @ContentOfFakeObject перед EXEC(@ContentOfFakeObject).

print @ContentOfFakeObject
EXEC(@ContentOfFakeObject)
4 июл 13, 10:23    [14520573]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка триггера в SQL 2008  [new]
Glory
Member

Откуда:
Сообщений: 104760
Rusich2012
hoha_ftf, должен выполнится метод ALTER. Хочется понять, что нужно добавить.

Нужно проверять, почему не сработал цикл WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
4 июл 13, 10:25    [14520592]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка триггера в SQL 2008  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Rusich2012
hoha_ftf, должен выполнится метод ALTER. Хочется понять, что нужно добавить.

Ничего он не должен.
Триггеров без кода не бывает
4 июл 13, 10:36    [14520661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить