Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А знаете ли вы ? / 1 сообщений из 1, страница 1 из 1
28.01.2002, 14:51
    #32021651
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А знаете ли вы ?
1.В очередной раз наткнувшись на недокументированные функции NT_CLIENT() - аналогична SYSTEM_USER
и PROGRAM_NAME() - аналогична APP_NAME(), была предпринята попытка найти их все, и раз и навсегда
покончить с "дискриминацией". Было обнаружено более 30 интригующих наименования, которые были
протестированы с целью возможного их использования. К сожалению, более 20 из них SQL2K отказался
признавать за свои, большая часть из оставшихся осталась непонятой. И, наконец, несколько штук
показались интересными. Здесь описаны всего 2, которые могут представлять некоторый интерес для
разработчиков.
а). Функция GetDefault({dbname|dbid}, defaultid) возвращает вычисленное значение DEFAULT по его
идентификатору в соответствующей БД. Самый большой недостаток этой функции в том, что в качестве
параметров она воспринимает только литералы(бишь, символьные константы), что резко снижает ее
полезность на практике. По инерции была написана процедура, которую можно использовать, если
потребность в значении DEFAULT является настоятельной.

/* Возвращает значение DEFAULT */
CREATE PROCEDURE dbo.DefaultValue
@DefaultName sysname,
@RetVal sql_variant OUTPUT
AS
DECLARE @DefID int, @SQL nvarchar(400)
SET @DefID = OBJECT_ID(@DefaultName)
IF @DefID IS NULL BEGIN
RAISERROR (15016, 16, 1, @DefaultName)
RETURN
END
SET @SQL = N'SET @Val = GetDefault(' + QUOTENAME(ISNULL(PARSENAME(@DefaultName, 3), DB_NAME()), '''') + N', ' + CAST(@DefID AS nvarchar(11)) + N')'
EXEC master.dbo.sp_executesql @SQL, N'@Val sql_variant OUTPUT', @RetVal OUTPUT
GO

Входным параметром является наименование DEFAULT, в том числе с указанием БД, в
котором оно "живет". Выходным - собственно, значение. Так как значение может иметь
любой тип, то данный параметр имеет тип sql_variant.
Пример использования:

DECLARE @RetVal sql_variant
EXEC dbo.DefaultValue 'msdb..default_current_date', @RetVal OUT
SELECT @RetVal

б). Функция UnCompress, каковая несмотря на свое громкое название умеет только
переводить varbinary(n) в nvarchar(n). Так как то же самое с помощью CAST сделать
несколько сложнее, то полезность этой функции хоть и невелика, но наличествует.
Кстати, позже было обнаружено, что она используется где-то в дебрях для чтения из
поля ctext таблицы syscomments.
Пример использования:

DECLARE @str varbinary(6)
SET @str = CAST(N'PdQRy' AS varbinary(6))
SELECT UnCompress(@str) -- varbinary(1-byte chars) to nvarchar

2.Любой свой объект можно сделать системным, что, по крайней мере, защищает их от простого
удаления либо изменения. Этот процесс выполняется с помощью системной процедуры
sp_MS_marksystemobject. Для обратного процесса процедура не обнаружена. Вероятно по причине,
что если Вы набрались наглости "засистематизировать" свой объект, то квалификация достаточна
и для обратной процедуры. Суть метода заключается в последних строчках вышеуказанной процедуры,
которые можно вырезать и вместо "| 0xC0000000" подставить "& 0x3FFFFFFF", после чего "системный"
объект вновь превращается в обычный. Только не забудьте, что для выполнения обратной операции
необходимо разрешить прямое обновление системных таблиц с помощью sp_configure.

3. Так же как процедуры с именем, начинающимся с sp_ сначала ищутся в master базе данных, так же
и функции, начинающиеся на fn_, демонстрируют такое же поведение. Единственный нюанс заключается
в том, что владельцем такой функции должен быть system_function_schema, что элементарно делается
под sa, а скорее под владельцем БД master. Кстати, для такой операции тоже необходима возможность
прямого обновления системных таблиц.

------------------
Благодарю за внимание

P.S. Прямое обновление системных таблиц после выполнения специфических операций лучше сразу запретить.

P.P.S. После знакомства с MSMQ очень захотелось использовать следующие процедуры:
xp_controlqueueservice
xp_createprivatequeue
xp_createqueue
xp_decodequeuecmd
xp_deleteprivatequeue
xp_deletequeue
xp_displayqueuemesgs
xp_peekqueue
xp_readpkfromqueue
xp_resetqueue
Если кто-нибудь знаком с этими процедурами не понаслышке, был благодарен получить о
них как можно более полную информацию по cha@vkkb.ru, или хотя бы ссылку на такую информацию.
Куцая информация из системных процедур не интересует.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А знаете ли вы ? / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]