Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
notricky
Member

Откуда:
Сообщений: 413
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86)   Dec 10 2010 10:56:29   
Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3) 

Товарисчи, поскольку, говорят, SLQ 2005 не понимает Rename, то:
1. Хотелось бы уточнить правда ли это?
2. Написал код. Что с ним делать-то, ибо он страшен как не знаю что... Красивше сделать хочется, но как?

+ Верхняя часть кода
/****** Object:  DdlTrigger [OnAfterCreateUser]    Script Date: 08/17/2011 04:33:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE TRIGGER [OnAfterCreateUser] ON DATABASE
WITH EXECUTE AS CALLER
FOR
  CREATE_USER,
  DROP_USER,
  ALTER_USER
AS
BEGIN
DECLARE @data XML
SET @data = EVENTDATA()
--SELECT @data

DECLARE @user sysname, @srvLogin sysname, @type varchar(100), @id int
SET @user = @data.value('(/EVENT_INSTANCE/ObjectName)[1]','sysname')
Set @srvLogin = (select l.name from sys.database_principals u
                   left join sys.server_principals l on l.sid = u.sid
                 where u.type <> 'R' and u.name = @User)
set @type = @data.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)')


IF (@type = 'CREATE_USER') 
BEGIN
  /*Танец с бубном первый*/ 
END
ELSE
IF (@type = 'DROP_USER')
BEGIN
  /*Танец с бубном второй*/ 
END
ELSE
IF (@type = 'ALTER_USER')
BEGIN
  Declare @SqlCommand nvarchar(max), @Old sysname
  SET @SqlCommand = @Data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
  /* тут получаем UserName который альтерится; @User  - новое имя, см верхний код */
  SET @Old = LTRIM(SUBSTRING(@SqlCommand,CHARINDEX('USER',@SqlCommand)+5,Len(@SqlCommand)))
  SET @Old = RTRIM(SUBSTRING(@Old,1,CHARINDEX('WITH',@Old)-1))
  SET @Old = 
SUBSTRING(SUBSTRING(@Old,CHARINDEX('[',@Old)+1,Len(@Old)),1,Len(@Old)-CHARINDEX(']',SUBSTRING(@Old,Len(@Old)-1,Len(@Old))))
  
  /*Подтанцовка с бубном, что то вроде поиска старого имени объекта и 
  манипуляции с присвоением нового имени того же объекта*/
END
+ Нижняя часть кода
END

GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [OnAfterCreateUser] ON DATABASE

Получаем в итоге @Old - старое имя и @User - новое имя. И вообще:
3. Какого лешего ObjectName хранит новое имя объекта, а не старое?

Страшит меня именно ALTER-часть. Где приходится T-SQL-но парсить и находить нужную переменную. Это еще при том, если запрос на альтер вида "ALTER USER офигеть WITH NAME = ни..ясебе". Если по первому вопросу ответ - правда, то есть ли варианты парсить красивее и изящнее?
17 авг 11, 06:35    [11130223]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
notricky
Товарисчи, поскольку, говорят, SLQ 2005 не понимает Rename, то:
1. Хотелось бы уточнить правда ли это?


sp_rename
Changes the name of a user-created object in the current database. This object can be a table, index, column, alias data type, or Microsoft .NET Framework common language runtime (CLR) user-defined type.
17 авг 11, 09:05    [11130485]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
notricky
Member

Откуда:
Сообщений: 413
Glory
notricky
Товарисчи, поскольку, говорят, SLQ 2005 не понимает Rename, то:
1. Хотелось бы уточнить правда ли это?


sp_rename
Changes the name of a user-created object in the current database. This object can be a table, index, column, alias data type, or Microsoft .NET Framework common language runtime (CLR) user-defined type.

А как в 2005ом трассировать эти изменения? Хотя бы может есть способ парсинга красивый?
17 авг 11, 13:58    [11132932]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
notricky
Member

Откуда:
Сообщений: 413
Нет вариантов?
18 авг 11, 01:52    [11136793]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ALTER-ом нельзя сменить имя объекта, парсить ничего не нужно.
2005 пролетает.
Зачем вам "Трассировка переименования объекта"? (У большинства проблем есть 100500 решений, оглянитесь)
Можно хранить свою таблицу объектов и её актуализировать разными способами.
18 авг 11, 21:19    [11142567]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
notricky
Member

Откуда:
Сообщений: 413
Mnior,

ммм. Имя объекта нет, а вот имя пользователя - можно!
Вот именно это и хочется решить, то есть трассировать. но есть и sp_rename ведь!
20 авг 11, 01:58    [11150072]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
notricky
Member

Откуда:
Сообщений: 413
notricky
Mnior,

ммм. Имя объекта нет, а вот имя пользователя - можно!
Вот именно это и хочется решить, то есть трассировать. но есть и sp_rename ведь!


И вот этот самый sp_rename как раз не попадает в ддл-альтерюзер-триггер. Что делать?
20 авг 11, 02:00    [11150078]     Ответить | Цитировать Сообщить модератору
 Re: DDL Trigger. FOR ALTER_XXX. Трассировка переименования объекта.  [new]
alexejs
Member

Откуда:
Сообщений: 147
Апгрейдиться
http://blogs.technet.com/b/isv_team/archive/2009/12/05/3298519.aspx
30 авг 11, 22:05    [11203440]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить