Microsoft SQL Server - Кто создал Хранимую процедуру?

Используя NIO2 , вы можете загрузить файл (если у вас есть права на чтение) и преобразовать его в InputStream , например:

Path path = Paths.get("/home/devuser/connection.properties");
InputStream str = Files.newInputStream(path);

8
задан BuddyJoe 3 March 2009 в 23:50
поделиться

5 ответов

Это может слишком опоздать в Вас теперь, но можно отслеживать действие DDL.

У нас есть таблица в нашей административной базе данных, которая добирается, все действие вставило ее. Это использует триггер DDL, в новинку для 2005. Эти сценарии составляют таблицу в Вашем администраторе DB (SQL_DBA для меня), создают триггер на образцовом дб, создают, включает существующие базы данных. Я также создал sp_msforeachDB оператор в конце для отключения всех их.

Один протест - Ваши базы данных должны быть в режиме эмуляции 90 (в опциях для каждого дб), иначе можно начать получать ошибки. Для учетной записи в ВЫПОЛНИТЬ части AS оператора также нужен доступ для вставки в администраторскую таблицу.

USE [SQL_DBA]
GO
/****** Object:  Table [dbo].[DDL_Login_Log]    Script Date: 03/03/2009 17:28:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DDL_Login_Log](
    [DDL_Id] [int] IDENTITY(1,1) NOT NULL,
    [PostTime] [datetime] NOT NULL,
    [DB_User] [nvarchar](100) NULL,
    [DBName] [nvarchar](100) NULL,
    [Event] [nvarchar](100) NULL,
    [TSQL] [nvarchar](2000) NULL,
    [Object] [nvarchar](1000) NULL,
 CONSTRAINT [PK_DDL_Login_Log] PRIMARY KEY CLUSTERED 
(
    [DDL_Id] ASC,
    [PostTime] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--This creates the trigger on the model database so all new DBs get it
USE [model]
GO
/****** Object:  DdlTrigger [ddl_DB_User]    Script Date: 03/03/2009 17:26:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_DB_User] 
ON DATABASE
FOR DDL_DATABASE_SECURITY_EVENTS
AS 

DECLARE @data XML
declare @user nvarchar(100)

SET @data = EVENTDATA()
select @user = convert(nvarchar(100), SYSTEM_USER)

execute as login='domain\sqlagent'
INSERT sql_dba.dbo.DDL_Login_Log 
   (PostTime, DB_User, DBName, Event, TSQL,Object) 
   VALUES 
   (@data.value('(/EVENT_INSTANCE/PostTime)[1]', 'nvarchar(100)'), 
   @user,
    db_name(),
    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
   @data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'),
    @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(1000)')
)

GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--CREATE TRIGGER IN ALL NON SYSTEM DATABASES

DECLARE @dataname varchar(255),
@dataname_header varchar(255),
@command VARCHAR(MAX),
@usecommand VARCHAR(100)
SET @command = '';
DECLARE datanames_cursor CURSOR FOR SELECT name FROM sys.databases 
WHERE name not in ('master', 'pubs', 'tempdb', 'model','msdb')
OPEN datanames_cursor
FETCH NEXT FROM datanames_cursor INTO @dataname
WHILE (@@fetch_status = 0)
BEGIN

PRINT '----------BEGIN---------'

PRINT 'DATANAME variable: ' + @dataname;

EXEC ('USE ' + @dataname);

PRINT 'CURRENT db: ' + db_name();

SELECT @command = 'CREATE TRIGGER DBA_Audit ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
DECLARE @cmd NVARCHAR(1000)
DECLARE @posttime NVARCHAR(24)
DECLARE @spid NVARCHAR(6)
DECLARE @loginname NVARCHAR(100)
DECLARE @hostname NVARCHAR(100)
SET @data = EVENTDATA()
SET @cmd = @data.value(''(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]'', ''NVARCHAR(1000)'')
SET @cmd = LTRIM(RTRIM(REPLACE(@cmd,'''','''')))
SET @posttime = @data.value(''(/EVENT_INSTANCE/PostTime)[1]'', ''DATETIME'')
SET @spid = @data.value(''(/EVENT_INSTANCE/SPID)[1]'', ''nvarchar(6)'')
SET @loginname = @data.value(''(/EVENT_INSTANCE/LoginName)[1]'',
    ''NVARCHAR(100)'')
SET @hostname = HOST_NAME()
INSERT INTO [DBA_AUDIT].dbo.AuditLog(Command, PostTime,HostName,LoginName)
 VALUES(@cmd, @posttime, @hostname, @loginname);'

 EXEC (@command);
 FETCH NEXT FROM datanames_cursor INTO @dataname;
PRINT '----------END---------'
END
CLOSE datanames_cursor
DEALLOCATE datanames_cursor

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

----Disable all triggers when things go haywire
sp_msforeachdb @command1='use [?]; IF  EXISTS (SELECT * FROM sys.triggers WHERE name = N''ddl_DB_User'' AND parent_class=0)disable TRIGGER [ddl_DB_User] ON DATABASE'
6
ответ дан 5 December 2019 в 11:27
поделиться

Если это не было создано слишком долго назад, попробуйте это:

DECLARE @path varchar(256)

SELECT @path = path
FROM sys.traces
where id = 1

SELECT *
FROM fn_trace_gettable(@path, 1)

Это выбирает ток (из поля) трассировка по умолчанию. Если это было недавно создано (и сервер не был недавно перезапущен), то имя объекта хранимой процедуры и имя для входа в систему, которое создало его, будут в данных трассировки.

4
ответ дан 5 December 2019 в 11:27
поделиться

Я полагаю, что это не доступно в SQL 2005. Конечно, это не доступно в свойствах в Studio управления SQL и не доступно в sys.objects таблице, или любые другие I видят.

3
ответ дан 5 December 2019 в 11:27
поделиться

Вдоль той же идеи как Sam Вы могли использовать триггер DDL, чтобы получить необходимую информацию, затем отправить те данные Сервисной очереди брокера SQL, которая могла передать его базе данных Admin (который мог быть на другом сервере в случае необходимости), который будет затем содержать все изменения DDL.

Это удалило бы проблему полномочий, поскольку триггер DDL будет загружать данные в Сервисную Очередь Брокера в локальной базе данных, и SQL обрабатывает перемещение сообщения к другой базе данных.

Было бы немного больше установки с этим методом, но однажды установка это будет работать, неважно, кто внес объектное изменение.

2
ответ дан 5 December 2019 в 11:27
поделиться

Как получить эту информацию постфактум (особенно годы спустя), скорее всего, невозможно.

Однако вы можете использовать SQL Server Profiler для отслеживания действий DDL. В окне «Выбор событий» проверьте следующие события:

Объекты / Объект: Изменено

Объекты / Объект: Создано

Объекты / Объект: Удалено

Также имеется множество параметров настройки: вы можете сохранить вывод в файл или таблицу, отфильтруйте вывод на основе любых столбцов и т. д. и т. д.

0
ответ дан 5 December 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: