Диаграмма схемы студии данных Azure?
Я только что скачал Azure Data Studio с SQL Server Express, так как я использую Linux . Существует ли функция построения диаграмм отношения сущностей, вроде того, как в SQL Server Management Studio есть функция диаграммы базы данных? Я хочу визуально увидеть отношения с таблицами в базе данных, если это возможно.
7 ответов
Оставим это здесь для будущих людей, задающих этот вопрос. Хотя Azure Data Studio не поддерживает это, DBeaver поддерживает кроссплатформенность. https://dbeaver.io/
У меня была такая же проблема, и, щелкнув правой кнопкой мыши dbo в папке Schemas вашей базы данных в проводнике базы данных, вы можете выбрать "View Diagram", и он создаст представление, как это делает SQL Server Management Studio.
Я не знаю, ищете ли вы еще какое-то расширение для этого. Во всяком случае, я решил с помощью https://github.com/R0tenur/visualization.
Это расширение использует файл mermaid.js для создания схемы.
Если вы хотите установить его, просто посмотрите здесь, загрузите файл vsix и установите его из файла -> Установить расширение из пакета VSIX в Azure Data Studio.
Вы можете создать схему схемы с помощью плагина «Визуализация схемы» , просто загрузите
.vsix
файл последней версии и установите его из Azure Data Studio, как показано на этом изображении.
К сожалению, это невозможно. На данный момент в Azure Data Studio отсутствует схема схемы базы данных. Эта функция была запрошена в 2017 году https://github.com/Microsoft/azuredatastudio/issues/94 но до сих пор нет обновлений об этом.
Я попытался использовать расширение «Визуализация схемы». К сожалению, по какой-то причине он продолжал выдавать ошибки. Итак, я должен вернуться к нативной схеме «sys», с помощью которой я сгенерировал специальный формат https://dbdiagram.io/home , используя следующий код:
CREATE TABLE #CreateQueries
(
QueryString NVARCHAR(MAX)
)
DECLARE @Counter INT
DECLARE
@object_name SYSNAME
, @object_id INT
, @SQL NVARCHAR(MAX)
SET @Counter=0
WHILE ( @Counter <= ( SELECT COUNT(*) FROM sys.objects WHERE type = 'U' ) )
BEGIN
SELECT
@object_name = OBJECT_SCHEMA_NAME(o.[object_id]) + '.' + OBJECT_NAME([object_id])
, @object_id = [object_id]
FROM (SELECT [object_id] = OBJECT_ID('dbo.' + name, 'U') FROM sys.objects WHERE type = 'U' ORDER BY name OFFSET @Counter ROWS FETCH FIRST 1 ROWS ONLY) o
SET @SQL = ''
SELECT @SQL = 'Table ' + @object_name + CHAR(13) + '{' + CHAR(13) +
TRIM( CHAR(13) + CHAR(10) FROM (SELECT CHAR(13) + CHAR(10) + c.name + ' ' + tp.name+
CASE
WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('nvarchar', 'nchar')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length / 2 AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset')
THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')'
WHEN tp.name = 'decimal'
THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')'
ELSE ''
END + CHAR(13) + CHAR(10)
FROM sys.columns c WITH(NOLOCK)
JOIN sys.types tp WITH(NOLOCK) ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.check_constraints cc WITH(NOLOCK)
ON c.[object_id] = cc.parent_object_id
AND cc.parent_column_id = c.column_id
WHERE c.[object_id] = @object_id
ORDER BY c.column_id
FOR XML PATH(''), TYPE)
.value('.', 'NVARCHAR(MAX)') ) + CHAR(13) + CHAR(10) + '}' + CHAR(13) + CHAR(10) +
ISNULL( ( SELECT 'Ref: '+ @object_name +
'.'+ COL_NAME(f_k_c.[parent_object_id], f_k_c.[parent_column_id])+ ' < '+
OBJECT_SCHEMA_NAME(f_k_c.referenced_object_id) + '.' + OBJECT_NAME(f_k_c.referenced_object_id) +
'.'+COL_NAME(f_k_c.[referenced_object_id], f_k_c.[referenced_column_id])+CHAR(13)+CHAR(10)
FROM sys.foreign_keys f WITH(NOLOCK)
JOIN sys.foreign_key_columns f_k_c WITH(NOLOCK) ON
f_k_c.constraint_object_id = f.object_id
AND f.parent_object_id = @object_id
FOR XML PATH(''), TYPE)
.value('.', 'NVARCHAR(MAX)'), '')
SET @Counter = @Counter + 1
INSERT INTO #CreateQueries VALUES (@SQL)
END
SELECT * FROM #CreateQueries ORDER BY QueryString;
Пока мы не получим правильное расширение, мы можем использовать этот код в качестве обходного пути и использовать «dbdiagram.io», чтобы сделать все остальное за нас.
У меня были некоторые проблемы с работой скрипта @sabharikarthik (происходило какое-то усечение), но он показался мне очень удобным. Поэтому я изменил его, чтобы он работал у себя. Вот. Вам необходимо скопировать/вставить из окна вывода, удалив часть «Время завершения: » с конца.
CREATE PROC [dbo].[pDBDiagram]
@SchemaFilter VARCHAR(100)='dbo'
AS
-- Generate code to be pasted into https://dbdiagram.io/d
-- Based on https://stackoverflow.com/a/73518800/1690193
SET NOCOUNT ON;
DECLARE @TotalObjects INT
DECLARE @Counter INT
DECLARE @CR VARCHAR(2) = CHAR(13) + CHAR(10)
DECLARE
@object_name SYSNAME
, @object_id INT
, @SQL NVARCHAR(MAX)
SET @SchemaFilter = 'bil'
SET @Counter=0
SELECT @TotalObjects = COUNT(*) FROM sys.objects so WHERE so.type = 'U' and so.schema_id = SCHEMA_ID(@SchemaFilter)
PRINT '// Found ' + FORMAT(@TotalObjects,'0') + ' tables'
WHILE ( @Counter < @TotalObjects )
BEGIN
SELECT
@object_name = OBJECT_SCHEMA_NAME(o.[object_id]) + '.' + OBJECT_NAME([object_id])
, @object_id = [object_id]
FROM (
SELECT [object_id] = OBJECT_ID(@SchemaFilter + '.' + ob.name, 'U')
FROM sys.objects ob
WHERE ob.type = 'U'
AND ob.schema_id = SCHEMA_ID(@SchemaFilter)
ORDER BY ob.name OFFSET @Counter ROWS FETCH FIRST 1 ROWS ONLY) o
SET @SQL = ''
SELECT @SQL = 'Table ' + @object_name + CHAR(13) + '{' + CHAR(13) +
TRIM( CHAR(13) + CHAR(10) FROM (SELECT CHAR(13) + CHAR(10) + c.name + ' ' + tp.name+
CASE
WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('nvarchar', 'nchar')
THEN '(' + CASE WHEN c.max_length = -1
THEN 'MAX'
ELSE CAST(c.max_length / 2 AS VARCHAR(5))
END + ')'
WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset')
THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')'
WHEN tp.name = 'decimal'
THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')'
ELSE ''
END + CHAR(13) + CHAR(10)
FROM sys.columns c WITH(NOLOCK)
JOIN sys.types tp WITH(NOLOCK) ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.check_constraints cc WITH(NOLOCK)
ON c.[object_id] = cc.parent_object_id
AND cc.parent_column_id = c.column_id
WHERE c.[object_id] = @object_id
ORDER BY c.column_id
FOR XML PATH(''), TYPE)
.value('.', 'NVARCHAR(MAX)') ) + CHAR(13) + CHAR(10) + '}' + CHAR(13) + CHAR(10) +
ISNULL( ( SELECT 'Ref: '+ @object_name +
'.'+ COL_NAME(f_k_c.[parent_object_id], f_k_c.[parent_column_id])+ ' < '+
OBJECT_SCHEMA_NAME(f_k_c.referenced_object_id) + '.' + OBJECT_NAME(f_k_c.referenced_object_id) +
'.'+COL_NAME(f_k_c.[referenced_object_id], f_k_c.[referenced_column_id])+CHAR(13)+CHAR(10)
FROM sys.foreign_keys f WITH(NOLOCK)
JOIN sys.foreign_key_columns f_k_c WITH(NOLOCK) ON
f_k_c.constraint_object_id = f.object_id
AND f.parent_object_id = @object_id
FOR XML PATH(''), TYPE)
.value('.', 'NVARCHAR(MAX)'), '')
PRINT '// ' + ISNULL(@object_name,'') + ' [' + FORMAT(@Counter+1,'0') + ']'
PRINT @SQL;
SET @Counter = @Counter + 1
--INSERT INTO #CreateQueries VALUES (@SQL)
END
У меня тоже была эта пробема. У меня была ssms 18 , и я создал диаграмму на сервере linux sql, но через несколько дней диаграмма не открылась. Я скачал ssms 19 preview 3 и создал новую диаграмму, и она отлично работает. Загрузите ssms 19: https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms-19?view=sql-server-ver16 .