Есть ли способ исправить жестко закодированные имена баз данных в моем представлении на SQL Server? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть вид, где я в настоящее время использовал жестко закодированные имена баз данных. Но проблема этого подхода заключается в том, что для каждой среды сервера необходимо изменить имя базы данных, поскольку имена баз данных не согласованы на всех серверах.

Я использую .dacpac для развертывания базы данных с одного сервера на другой, но проблема в том, что имена баз данных несовместимы.

например, для некоторых серверов имя базы данных равно PatientDemographics_Migration, но на некоторых серверах имя PatientDemographics_Migration_P, и то же самое относится к другой базе данных имя, используемое здесь в скрипте.

Есть ли способ решить эту проблему? Я не хочу предоставлять имя базы данных для каждой среды.

CREATE VIEW [dbo].[vw_migration_Demographics] 
AS 
    SELECT DISTINCT 
        patdemo.NHI AS [NHI],
        demo.FamilyName AS [Surname],
        demo.FirstName AS [FirstName],
        demo.Prefix AS [Title],
        demo.Gender AS [Gender]
    FROM 
        [PatientDemographics_Migration].[dbo].[PatientDemographics] demo
    INNER JOIN 
        [Encounter_Migration].[dbo].PatientEncounter pe ON pe.NHI = demo.nhi

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Здесь есть только одно реальное решение, как было упомянуто в другом ответе: «исправьте» имена баз данных на ваших серверах, сделайте их последовательно именованными. Это означает, что имя базы данных на всех серверах должно быть одинаковым. Исходя из вашего вопроса, это будет PatientDemographics_Migration и Encounter_Migration.

. Вы можете переименовать базу данных, как описано в документации :

USE master;  
GO  
ALTER DATABASE MyTestDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE MyTestDatabase MODIFY NAME = MyTestDatabaseCopy ;
GO  
ALTER DATABASE MyTestDatabaseCopy SET MULTI_USER
GO

Очевидно, замените MyTestDatabase и MyTestDatabaseCopy соответствующими именами.

Конечно, переименование ваших баз данных также может нарушить другой код, если вы использовали 3 части именования в другом месте, так что вы будете после того, как вы переименуете базу данных, нужно также исправить определения этих объектов.


Как я уже упоминал в своем комментарии к вопросу, VIEW объекты не могут динамически ссылаться на объекты. Это должно быть четко определено как ссылка, указывающая c объекты, и может содержать только оператор SELECT (допускаются CTE, поскольку они являются выражениями).

Однако они могут использовать синонимы, которые может быть полезным в этих обстоятельствах. Эти синонимы по-прежнему необходимо создавать и определять специально для каждого экземпляра, однако тогда ваше определение VIEW будет иметь следующий вид: c.

Во-первых, вы создадите SYNONYM:

USE {Database containing the VIEW};
GO
CREATE SYNONYM dbo.PatientDemographics FOR [PatientDemographics_Migration].[dbo].[PatientDemographics];
GO
CREATE SYNONYM dbo.PatientEncounter FOR [Encounter_Migration].[dbo].PatientEncounter;
GO

Эти синонимы будут отличаться для каждого экземпляра, который имеет другое имя для базы данных. Таким образом, для суффикса _P это будет:

CREATE SYNONYM PatientDemographics FOR [PatientDemographics_Migration_P].[dbo].[PatientDemographics];

Затем, как только вы создадите синонимы на заказ для экземпляра, в базе данных будет создан VIEW в, вы можете создать VIEW, используя определение stati c во всех случаях:

CREATE VIEW [dbo].[vw_migration_Demographics] 
AS 
    SELECT DISTINCT 
        patdemo.NHI AS [NHI],
        demo.FamilyName AS [Surname],
        demo.FirstName AS [FirstName],
        demo.Prefix AS [Title],
        demo.Gender AS [Gender]
    FROM 
        [dbo].[PatientDemographics] demo --Notice no 3 part naming as it references the synonym in the same database
    INNER JOIN 
        [dbo].PatientEncounter pe ON pe.NHI = demo.nhi; --Notice no 3 part naming as it references the synonym in the same database
1 голос
/ 03 мая 2020

Проблема здесь заключается в несовместимой номенклатуре именования баз данных. Следуйте принципу наименьшего удивления - Другими словами, пользователи не должны удивляться, поражаться или удивляться поведению системы или поведению любых компонентов системы.

Вы не должны изменять Имя базы данных в любой среде. В конечном итоге вы тратите лишнее время, пытаясь обойти это.

Стандартизуйте имена ваших баз данных и начните использовать именованные экземпляры, если они вам нужны для альтернативных сред и т. Д. c. Продажа должна быть легкой, поскольку экономия времени и усилий окупится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...