Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Добрый день.

1. Вообщем проделываем следующую последовательность действий.
Создаем таблицу (T1), на нее вешаем View (V1), на view V1 вешаем еще одну view V2.
А затем удаляем таблицу T1.
При этом SQL Server позволяет сделать ALTER VIEW dbo.V2. (Скрипт ниже у меня отрабатывает корректно).
Позволяет сделать скорее всего потому что структура view у нас уже определена и мы на нее полагаемся.

2. А теперь расскомментируем "SELECT * FROM dbo.V2".
И вот мы уже не можем сделать ALTER VIEW dbo.V2.
Получается, что select statement реально что-то меняет на стороне сервера и дает понять, что у нас есть проблема с view.
Для меня это прикольно потому что я думал, что "select" - это просто селект.
И мне кажется поведение немного нелогичным.
И вот интересно, в какой момент SQL Server решает что есть binding-проблемы с view? Может есть какая-то опция, которая это контролирует.

4. На всякий случай приложу версию SQL Server. Но у нас воспроизводится стабильно.

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T1]') AND type in (N'U'))
	DROP TABLE dbo.T1
GO
CREATE TABLE dbo.T1
(
	f1 int  NOT null
)
GO
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[V1]'))
	DROP VIEW dbo.V1
GO
CREATE VIEW dbo.V1
AS
SELECT *
FROM dbo.T1
GO
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[V2]'))
	DROP VIEW dbo.V2
GO
CREATE VIEW dbo.V2
AS 
SELECT *
FROM dbo.V1
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T1]') AND type in (N'U'))
	DROP TABLE dbo.T1
GO
--Code should be uncommeted here.
--SELECT * FROM dbo.V2
GO
ALTER VIEW dbo.V2
AS 
SELECT *
FROM dbo.V1
GO


Сообщение было отредактировано: 10 ноя 14, 14:21
10 ноя 14, 14:20    [16822441]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кто пишет звездочки во view - тот сам себе злобный буратина.
Binding-проверки контролируются наличием кляузы with schemabinding при создании представления.
10 ноя 14, 14:23    [16822456]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8804
Павел-П,

откройте для себя WITH SCHEMABINDING .
10 ноя 14, 14:27    [16822486]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T1]') AND type in (N'U'))
	DROP TABLE dbo.T1
GO
CREATE TABLE dbo.T1
(
	f1 int  NOT null
)
GO
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[V1]'))
	DROP VIEW dbo.V1
GO
CREATE VIEW dbo.V1
AS
SELECT *
FROM dbo.T1
GO
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[V2]'))
	DROP VIEW dbo.V2
GO
CREATE VIEW dbo.V2 
AS 
SELECT *
FROM dbo.V1
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T1]') AND type in (N'U'))
	DROP TABLE dbo.T1
GO
exec sp_refreshview 'dbo.V1'
GO
ALTER VIEW dbo.V2
AS 
SELECT *
FROM dbo.V1
GO
10 ноя 14, 14:28    [16822493]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Да вопрос не в schemabinding, и не во звездочках.

Получается, что обычный select-statement меняет что-то в мозгах у SQL Server DB engine.
Мне кажется это очень прикольным.
10 ноя 14, 14:30    [16822504]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8804
Павел-П, что не так, не пойму?
Может есть какая-то опция, которая это контролирует

см. выше

Селект читает метаданные... Далее строится план запроса...
10 ноя 14, 14:40    [16822571]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Владислав Колосов,

1. В случае когда select закомментирован - вы можете прекрасно сделать alter view.
2. В случае когда select расскоментирован - вы не можете сделать alter view.

Вы считаете, что это потому что select читает мета-данные? Я не понимаю, при чем тут чтение метаданных select-ом к тому, что операция alter view выполняется или не выполняется.
10 ноя 14, 14:56    [16822691]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Просто для меня select и exec sp_refreshview 'dbo.V1', который приведен Glory выше - это немножко разные операции.
Но select вроде бы как не делает refresh view.
10 ноя 14, 14:59    [16822709]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
1. В случае когда select закомментирован - вы можете прекрасно сделать alter view.

Потому что alter меняет только свои метаданные, которые уже устарели.

Павел-П
2. В случае когда select расскоментирован - вы не можете сделать alter view.

Потому что метаданные уже обновлены. Как и в случае с sp_refreshview
10 ноя 14, 14:59    [16822715]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Павел-П
1. В случае когда select закомментирован - вы можете прекрасно сделать alter view.

Потому что alter меняет только свои метаданные, которые уже устарели.

Павел-П
2. В случае когда select расскоментирован - вы не можете сделать alter view.

Потому что метаданные уже обновлены. Как и в случае с sp_refreshview


Т.е. select обновляет метаданные?
10 ноя 14, 15:02    [16822736]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Т.е. select обновляет метаданные?

Не select, а сервер. И то при возникновении ошибки.
И не обновлении метаданных, а скорее какой-то "флаг" - недостоверные метаданные
При ошибке SELECT * FROM dbo.V1 это тоже произойдет .

По мне так все вполне логично
10 ноя 14, 15:12    [16822822]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Павел-П,

Собственно вопрос то и есть в том, почему метаданные без выполнения select - не обновлены.
А с выполнением select уже обновлены?

Select - это же вам не refreshview.
10 ноя 14, 15:13    [16822825]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Собственно вопрос то и есть в том, почему метаданные без выполнения select - не обновлены.

А кто/что их обновит/проверит ?
10 ноя 14, 15:15    [16822844]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory,

Вот "с возникновением ошибки" - мне нравится.

Но все равно прикольно. Результат выполнения кода зависит от того, успел ли кто-то другой запустить селект или нет.
10 ноя 14, 15:16    [16822859]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Павел-П
Собственно вопрос то и есть в том, почему метаданные без выполнения select - не обновлены.

А кто/что их обновит/проверит ?


не стоит вырывать фразу из контекста. там 2 фразы. и одна завязана на другую.
10 ноя 14, 15:18    [16822873]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Но все равно прикольно. Результат выполнения кода зависит от того, успел ли кто-то другой запустить селект или нет.

Прикольно, что вы не различаете DML и DDL
И как вы еще додумались писать какие-то проверки перед созданием своих объектов.
Неужеди вы думаете, что создание объекта будет зависеть от того, успел ли кто-то другой запустить какие то запросы ?
10 ноя 14, 15:19    [16822887]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
не стоит вырывать фразу из контекста. там 2 фразы. и одна завязана на другую.

Да хоть 100 фраз.
10 ноя 14, 15:20    [16822894]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Павел-П
Но все равно прикольно. Результат выполнения кода зависит от того, успел ли кто-то другой запустить селект или нет.

Прикольно, что вы не различаете DML и DDL
И как вы еще додумались писать какие-то проверки перед созданием своих объектов.
Неужеди вы думаете, что создание объекта будет зависеть от того, успел ли кто-то другой запустить какие то запросы ?


Подождите, Вы сами говорите, что результат ALTER VIEW команды будет зависить от того как выполнился DML-statement (с ошибкой или без). Поправьте, меня, пжл, если я что-то неправильно понял.
В нашем случае DML-statement - это селект.

Еще раз повторю.
По-моему приведенный пример показывает, что выполнение DML-statement-а влияет на DDL.
В этом я и вижу противоречие.

Если DML - select не выполняется - все хорошо.
Если DML - выполнился - DDL - завалится.
10 ноя 14, 15:27    [16822949]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Неужеди вы думаете, что создание объекта будет зависеть от того, успел ли кто-то другой запустить какие то запросы ?


Ну по-моему пример явно показывает, что результат ALTER VIEW зависит от select. Или у Вас не зависит?
10 ноя 14, 15:31    [16822981]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Подождите, Вы сами говорите, что результат ALTER VIEW команды будет зависить от того как выполнился DML-statement (с ошибкой или без). Поправьте, меня, пжл, если я что-то неправильно понял.
В нашем случае DML-statement - это селект.

Не DML-statement, а ошибка при попытке прочитать метаданные для его выполнения.

Павел-П
По-моему приведенный пример показывает, что выполнение DML-statement-а влияет на DDL.
В этом я и вижу противоречие.
Если DML - select не выполняется - все хорошо.
Если DML - выполнился - DDL - завалится.

Вот вы тогда перед CREATE/DROP TABLE t1 зачем проверку выполняете на наличие таблицы ?
10 ноя 14, 15:33    [16823004]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
[quot Glory
Вот вы тогда перед CREATE/DROP TABLE t1 зачем проверку выполняете на наличие таблицы ?[/quot]

так это чтобы вам много раз скрипт запускать было легче. :-)
10 ноя 14, 15:34    [16823016]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
Ну по-моему пример явно показывает, что результат ALTER VIEW зависит от select. Или у Вас не зависит?

А sp_refreshview тогда не зависит ?
10 ноя 14, 15:34    [16823019]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Павел-П
так это чтобы вам много раз скрипт запускать было легче. :-)

Т.е. у все DDL зависят от выполнения/невыполнения каких-то селектов что ли ?
10 ноя 14, 15:35    [16823029]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Павел-П
Ну по-моему пример явно показывает, что результат ALTER VIEW зависит от select. Или у Вас не зависит?

А sp_refreshview тогда не зависит ?


А причем здесь sp_refreshview. По-моему результат выполнения команды sp_refreshview зависит от результата выполнения команды sp_refreshview.
10 ноя 14, 15:39    [16823088]     Ответить | Цитировать Сообщить модератору
 Re: Хочу понять. "Select statement" который меняет серверную логику выполнения скрипта.  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Glory
Павел-П
так это чтобы вам много раз скрипт запускать было легче. :-)

Т.е. у все DDL зависят от выполнения/невыполнения каких-то селектов что ли ?


Я не понимаю Ваш вопрос. Такое ощущение, что вы вырываете фразы из контекста, делаете какиее-то непонятные выподны, а потом еще и вопрос задаете.
10 ноя 14, 15:40    [16823099]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить