Запит без вказівки схеми таблиці


10

Я імпортував купу таблиць із SQL Server 2000 до моєї бази даних 2008 року. Всі імпортовані таблиці з префіксом моє ім'я користувача , наприклад: erpadmin.tablename.

У властивостях таблиці він відображає "erpadmin" як схему db. Коли я пишу запит, я повинен включати "erpadmin". перед усіма назвами таблиці, що заплутано.

Поточний результат:

select *
from erpadmin.tablename

Бажаний результат:

select *
from  tablename

Відповіді:


23

Якщо ви хочете повернутися до використання схеми dbo, як ви були у SQL Server 2000, ви можете перемістити таблицю назад у схему dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Альтернативою, якщо вам подобається мати схему без dbo, є встановити схему за замовчуванням користувача, erpadminа потім, якщо ви не вказали схему, вона використовуватиме її як за замовчуванням. (Учасники фіксованої ролі сервера sysadmin ігнорують DEFAULT_SCHEMAі використовують dboза замовчуванням.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Ім'я двох частин, яке ви маєте (schema.table), - це корисна звичка потрапляти, хоча ви зможете чітко вказати, до якої таблиці ви звертаєтесь. Деякі функції вимагають використання імені з двох частин, індексованими переглядами - один із прикладів.


17

Це класичний випадок, чому ви повинні вказати ім'я схеми під час доступу до об'єктів бази даних. Якщо це не визначено, і ви намагаєтеся отримати доступ до об'єкта в схемі, що не використовується за замовчуванням, тоді ви зіткнетеся з проблемою, яку ви бачите зараз.

Справжнє виправлення полягає в тому, щоб змінити вашу заявку (або будь-який агент запиту, який у вас зараз є причиною проблеми) на явний.

Коли я пишу запит, я повинен включати "erpadmin". перед усіма назвами таблиці, що заплутано.

Це не заплутано, це явна умова іменування . Я рекомендую дотримуватися цієї номенклатури, щоб уникнути переміщення об'єктів та невідповідностей.


3
Ще одна причина завжди використовувати імена з двох частин - уникати ситуації, коли кілька користувачів виконують один і той же код (наприклад select ... from table5 ;) і отримують різні результати. Це погано для кешування планів, а також погано для усунення несправностей (особа, яка підтримує, "цей запит працює нормально"). Також для прив'язки схем, яка потрібна для індексації функцій та представлень, потрібні два назви частин. TLDR: перестань лінуватися - використовуй два назви частин.
Greenstone Walker

7

На додаток до відповіді @AdamWenger Для створення сценаріїв для перенесення на іншу схему ви можете використовувати наступний скрипт

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

Ваша проблема, ймовірно, пов’язана з тим, як було здійснено міграцію. Не слід додавати речі до свого користувача, якщо ви не вважаєтесь власником.

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

Якщо ви не переробляєте міграцію з якоїсь іншої причини, перехід Адама Венгера має бути мудрим варіантом.


-2

Почніть команду з USE [tablename] Вашого запиту, не має асоційованої бази даних для посилання, і база даних, на яку ви переглядаєте, не є типовою для користувача, який увійшов у систему. Угорі вікна запиту, ймовірно, написано "майстер"


3
Ви маєте на увазі [database_name], правда?
dezso
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.