Определить зависимости объектов между базой данных SQL сервера и Oracle на связанном сервере? - PullRequest
0 голосов
/ 02 августа 2020

Я работаю с SQL Серверным ядром базы данных, в базе данных которого содержится примерно 2000 просмотров. Большинство этих представлений используют оператор OpenQuery для выбора данных из базы данных Oracle через связанный сервер.

У меня есть новое требование для определения зависимостей между SQL серверными представлениями и Oracle Объекты, указанные в операторах OpenQuery. Это не будет разовым требованием, поэтому мне нужно будет время от времени обновлять sh это. Объекты внутри Oracle часто меняются, и новые представления регулярно добавляются или модифицируются на сервере SQL.

Некоторые из представлений (около 0,5% из них) структурированы, как показано ниже (без OpenQuery):

CREATE VIEW [dbo].[SampleViewType1] AS

SELECT  ColX,
        ColY
FROM OracleLinkedServerName..OracleSchemaName.SampleOracleTable1

Для этих представлений я наткнулся на полезный запрос, который может выбирать представления и Oracle объекты, на которые он ссылается.

SELECT 
    Distinct 
    referenced_Server_name As LinkedServerName,
    referenced_schema_name AS LinkedServerSchema,
    referenced_database_name AS LinkedServerDB,
    referenced_entity_name As LinkedServerTable,
    OBJECT_NAME (referencing_id) AS ObjectUsingLinkedServer
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL
And referenced_Server_name = 'OracleLinkedServerName'

Он может дать мне результаты, как показано ниже :

sys.sql_expression_dependencies result

Однако большинство представлений структурированы в соответствии с приведенным ниже примером и используют OpenQuery. К сожалению, sys.sql_expression_dependencies не принимает эти типы ссылок.

CREATE VIEW [dbo].[SampleViewType2] As

SELECT 
    ColA,
    ColB
FROM OPENQUERY 
(
    OracleLinkedServerName, 
    'SELECT *
    FROM SampleOracleTable2
    WHERE TestDate BETWEEN TRUNC(SYSDATE, ''month'') AND TRUNC(SYSDATE)'
);

Есть ли у кого-нибудь какие-либо предложения о том, как я могу получить эту информацию? На данный момент я не уверен, возможно ли это. Я открыт для использования других технологий за пределами SQL, таких как C#, VB и т.д. c.

1 Ответ

0 голосов
/ 02 августа 2020

Вы можете получить определение представления и проверить, имеет ли текст имя OracleLinkedServerName. Пожалуйста, обратитесь к запросу ниже

SELECT *
FROM (
    SELECT OBJECT_DEFINITION(OBJECT_ID(CONCAT (
                    ss.name
                    ,'.'
                    ,so.name
                    ))) [Definition]
        ,so.name
    FROM sys.objects so
    JOIN sys.schemas ss ON so.schema_id = ss.schema_id
    WHERE type = 'V'
    ) a
WHERE a.DEFINITION LIKE '%OracleLinkedServerName%'

Запрос, чтобы получить все объекты, которые используются в определении представления

DECLARE @objects TABLE (name NVARCHAR(max))

INSERT INTO @objects
SELECT so.name
FROM sys.objects so

-- You have to do this manually for all the oracle object
-- copy all your objects in excel and use excel funtions to form this
-- Remember last select should not have UNION All
INSERT INTO @objects
SELECT 'Oracle object 1'

UNION ALL

SELECT 'Oracle object 2'

SELECT *
FROM @objects so
INNER JOIN (
    SELECT *
    FROM (
        SELECT OBJECT_DEFINITION(OBJECT_ID(CONCAT (
                        ss.name
                        ,'.'
                        ,so.name
                        ))) [Definition]
            ,so.name
        FROM sys.objects so
        JOIN sys.schemas ss ON so.schema_id = ss.schema_id
        WHERE type = 'V'
        ) a
    WHERE a.DEFINITION LIKE '%OracleLinkedServerName%'
    ) a ON a.DEFINITION LIKE '%' + so.name + '%'
...