Можно ли добавить таблицу где-нибудь, к которой у всех баз данных в этом экземпляре есть доступ?Добавить таблицу для всех баз данных в SQL Server
Благодаря
Можно ли добавить таблицу где-нибудь, к которой у всех баз данных в этом экземпляре есть доступ?Добавить таблицу для всех баз данных в SQL Server
Благодаря
Вы можете создать базу данных «Main» и получить к нему доступ с запросами SQL из любой другой базы данных в этом экземпляре SQL Server. Это просто вопрос прав пользователя. Полный синтаксис для table_or_view_name
- database.schema.object_name
.
SELECT * FROM mytable AS t
INNER JOIN Main.dbo.SharedTable AS s ON t.Id=s.Id
....
Chack документация также - FROM (Transact-SQL)
Edit: я добавил второе решение.
Первое решение Вы можете попробовать использовать undocummented системную процедуру sp_msforeachdb:
EXEC sp_msforeachdb @command1=N'
USE ?;
IF ''?'' NOT IN (''master'',''model'',''tempdb'',''msdb'',''ReportServer'',''ReportServerTempDB'')
BEGIN
CREATE TABLE CocoJamboTable (
ID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL
);
END
';
EXEC sp_msforeachdb @command1=N'
USE ?;
IF ''?'' NOT IN (''master'',''model'',''tempdb'',''msdb'',''ReportServer'',''ReportServerTempDB'')
BEGIN
SELECT DB_NAME() AS DbName, name AS TableName, object_id FROM ?.sys.tables
WHERE name=''CocoJamboTable''
END
';
Второе решение Вы можете сгенерировать T-SQL
скрипт со всеми CREATE TABLE
заявления:
SET NOCOUNT ON;
PRINT 'BEGIN TRAN;'
/*
SELECT
'USE '
+ QUOTENAME(db.name)
+ ';'
+ '
CREATE TABLE CocoJamboTable (
ID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL
);'
+ CHAR(13)
*/
SELECT
CASE
WHEN db.name IN ('master','model','tempdb','msdb','ReportServer','ReportServerTempDB','ASPNETDB')
THEN '-- Explicit skipping: ' + QUOTENAME(db.name)
WHEN db.state <> 0
THEN '-- Implicit skipping (not online): ' + QUOTENAME(db.name)
WHEN db.is_read_only=1
THEN '-- Implicit skipping (read only): ' + QUOTENAME(db.name)
--WHEN other filter
-- THEN '-- Implicit skipping (my filter): ' + QUOTENAME(db.name)
ELSE
'CREATE TABLE ' + QUOTENAME(db.name) + '.dbo.CocoJamboTable (
ID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL
);'
END
+ CHAR(13)
FROM sys.databases db
ORDER BY db.name;
PRINT 'ROLLBACK;'
PRINT '-- COMMIT;'
Затем нажмите Ctrl + T (текстовые результаты), F5 (выполнить), F6 (панель результатов перехода к тексту l), Ctrl + A (выбрать все), Ctrl + C (копировать), Ctrl + N (новое окно), Ctrl + V (вставить - вставить скрипт, сгенерированный на предыдущем шаге), F5 (выполнить).
Пример T-SQL
сценарий:
BEGIN TRAN;
CREATE TABLE [Comisioane].dbo.CocoJamboTable (
ID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL
);
-- Implicit skipping (read only): [Credite]
-- Explicit skipping: [master]
-- Explicit skipping: [model]
-- Explicit skipping: [msdb]
-- Explicit skipping: [ReportServer]
-- Explicit skipping: [ReportServerTempDB]
CREATE TABLE [SIMUR4].dbo.CocoJamboTable (
ID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL
);
ROLLBACK;
-- COMMIT;
Нет, пожалуйста, прекратите рекомендовать 'sp_msforeachdb'. Он недокументирован, неподдерживается и полностью нарушен ([и Microsoft не исправляет его] (http://connect.microsoft.com/SQLServer/feedback/details/752629/disable-sp-msforeachdb-by-default-or-fix- Это)). См. Http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx и http://www.mssqltips.com/sqlservertip/2201/make-a-more-reliable-and-flexible-spmsforeachdb/ –
@AaronBertrand: Спасибо за ваш комментарий. Я иногда использую эту хранимую процедуру для специальных задач. Да, это не документировано, я написал. Он пропускает некоторые базы данных: да. Вот почему я написал второй 'sp_msforeachdb'. Для других проблем я использую транзакции: 'BEGIN TRANSACTION; ... sp_for ... ROLLBACK/COMMIT; '. Для 'dbo.ForEachDB_MyWay' будет приятно видеть предупреждение при пропусках только для чтения/не в онлайн-базах данных. –
@AaronBertrand: Я добавил второе решение. Спасибо. –
Я не хочу создать связанный server.I хочет некоторые вещи, как системы взглядов, которые доступны из всех databses – Arian
Это не привязанная сервера. Связанный сервер означает, что ваша «общая» база данных находится на другом экземпляре SQL Server. Вам не нужно настраивать что-либо дополнительно. Попробуйте. – Nenad
FYI, также ссылающийся на таблицу с использованием связанного сервера, требует имени 4-х частей [LinkedServerName]. [DatabaseName]. [SchemaName]. [TableName]. Чтобы ссылаться на таблицу в другой базе данных на том же сервере, вам нужно использовать только название из 3-х частей. [DatabaseName]. [SchemaName]. [TableName] –