Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти строки в текстах процедур, вью  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
Есть такая проблема: где-то в текстах процедур, триггеров, вью, функций могли проскочить имена таблиц и/или полей на апперкейсе, хотя реально они маленькими буквами.
Если создается база с CS получается проблема.

Странный вопрос: можно ли найти все строки в тексах объектов на апперкейсе? чтобы потом хотя бы глазами пробежаться по ним
12 май 17, 11:35    [20475455]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Ролг Хупин
Есть такая проблема: где-то в текстах процедур, триггеров, вью, функций могли проскочить имена таблиц и/или полей на апперкейсе, хотя реально они маленькими буквами.
Если создается база с CS получается проблема.

Странный вопрос: можно ли найти все строки в тексах объектов на апперкейсе? чтобы потом хотя бы глазами пробежаться по ним

Я только sys.sql_modules знаю - там вью, функции и процедуры точно есть.
12 май 17, 11:44    [20475523]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
komrad
Member

Откуда:
Сообщений: 5245
Ролг Хупин,

сюда еще можно глянуть
https://docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-syscomments-transact-sql
12 май 17, 11:57    [20475623]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Ролг Хупин,

Есть же удобные инструменты для поиска/переименования и немало их.
12 май 17, 12:05    [20475674]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Процедуры, триггеры, функции, представления, в которых есть хотя бы один символ в верхнем регистре:
SELECT type, name
FROM sys.objects
WHERE type IN('P','V','TR','FN','IF','TF')
  AND OBJECT_DEFINITION(object_id) <> LOWER(OBJECT_DEFINITION(object_id)) COLLATE Cyrillic_General_BIN2;
Может, я неправильно понял, конечно...
Но так уж описана проблема.
На простом русском языке можно сформулировать, что надо?
12 май 17, 12:08    [20475684]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
aleks2
Guest
iap
Процедуры, триггеры, функции, представления, в которых есть хотя бы один символ в верхнем регистре:
SELECT type, name
FROM sys.objects
WHERE type IN('P','V','TR','FN','IF','TF')
  AND OBJECT_DEFINITION(object_id) <> LOWER(OBJECT_DEFINITION(object_id)) COLLATE Cyrillic_General_BIN2;
Может, я неправильно понял, конечно...
Но так уж описана проблема.
На простом русском языке можно сформулировать, что надо?

А BIN то зачем?
12 май 17, 12:13    [20475711]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
o-o
Guest
iap
На простом русском языке можно сформулировать, что надо?

перевожу:
писали код модулей, как бог на душу положит,
например select * from DBO.MyTable

теперь выясняется, что базе хотят CASE SENSITIVE-коллэйшен выставить.
а тогда модули просто не найдут такие объекты,
ибо все таблицы в базе имеют имена только из строчных букв: dbo.mytable
вот он и хочет найти модули, где объекты написаны с участием прописных
12 май 17, 12:20    [20475757]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
aleks2
iap
Процедуры, триггеры, функции, представления, в которых есть хотя бы один символ в верхнем регистре:
SELECT type, name
FROM sys.objects
WHERE type IN('P','V','TR','FN','IF','TF')
  AND OBJECT_DEFINITION(object_id) <> LOWER(OBJECT_DEFINITION(object_id)) COLLATE Cyrillic_General_BIN2;

Может, я неправильно понял, конечно...
Но так уж описана проблема.
На простом русском языке можно сформулировать, что надо?

А BIN то зачем?
Case sensitive. Привык я к нему
BIN2 - потому что UNICODE
12 май 17, 12:21    [20475765]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
o-o
вот он и хочет найти модули, где объекты написаны с участием прописных
То есть, нужно найти объекты, в текстах которых встречаются имена объектов,
не совпадающие по регистру букв с прописанными в sys.objects. Так стоит задача?
Ща время будет, сочиню.
Только без учёта разделителей и начала/конца строк.
12 май 17, 12:28    [20475804]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Если есть сборка регулярных выражений в базе, то проще пареной репы.
12 май 17, 12:39    [20475878]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4213
Ролг Хупин
Есть такая проблема: где-то в текстах процедур, триггеров, вью, функций могли проскочить имена таблиц и/или полей на апперкейсе, хотя реально они маленькими буквами.
Если создается база с CS получается проблема.

Странный вопрос: можно ли найти все строки в тексах объектов на апперкейсе? чтобы потом хотя бы глазами пробежаться по ним

В таблице syscomments находятся все тексты объектов
12 май 17, 13:11    [20476101]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
SQL2008
Ролг Хупин
Есть такая проблема: где-то в текстах процедур, триггеров, вью, функций могли проскочить имена таблиц и/или полей на апперкейсе, хотя реально они маленькими буквами.
Если создается база с CS получается проблема.

Странный вопрос: можно ли найти все строки в тексах объектов на апперкейсе? чтобы потом хотя бы глазами пробежаться по ним

В таблице syscomments находятся все тексты объектов
А ничего, что поле с текстом там длиной 8000 символов?
12 май 17, 13:17    [20476133]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
iap
SQL2008
пропущено...

В таблице syscomments находятся все тексты объектов
А ничего, что поле с текстом там длиной 8000 символов?
То есть, не символов, а байт
12 май 17, 13:17    [20476138]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Вот скрипт, который даёт ооочень приблизительный результат (потому что не учитывает разделители),
и работает очень медленно:
SELECT type, name
FROM sys.objects o
WHERE type IN('P','V','TR','FN','IF','TF')
  AND EXISTS
  (
   SELECT *
   FROM sys.objects oo
   WHERE o.type IN('P','V','TR','FN','IF','TF','U')
     AND DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CI_AI,oo.name,N''))
	  <> DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CS_AI,oo.name,N''))
  );
12 май 17, 13:43    [20476329]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
iap
o-o
вот он и хочет найти модули, где объекты написаны с участием прописных
То есть, нужно найти объекты, в текстах которых встречаются имена объектов,
не совпадающие по регистру букв с прописанными в sys.objects. Так стоит задача?
Ща время будет, сочиню.
Только без учёта разделителей и начала/конца строк.


да, так, но можно уточнить: все имена объектов реально - lowercase, потому интерес представляют те имена, которые содержат апперкейс
12 май 17, 14:20    [20476518]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
iap
Вот скрипт, который даёт ооочень приблизительный результат (потому что не учитывает разделители),
и работает очень медленно:
SELECT type, name
FROM sys.objects o
WHERE type IN('P','V','TR','FN','IF','TF')
  AND EXISTS
  (
   SELECT *
   FROM sys.objects oo
   WHERE o.type IN('P','V','TR','FN','IF','TF','U')
     AND DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CI_AI,oo.name,N''))
	  <> DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CS_AI,oo.name,N''))
  );



Пример: есть вью

create view v1 as
select ID, Name from t1;

а таблица при этом:

create table t1
(
id int not null,
name nvarchar(1024)
)


такие вью хотелось бы найти
12 май 17, 14:32    [20476580]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Ролг Хупин
iap
Вот скрипт, который даёт ооочень приблизительный результат (потому что не учитывает разделители),
и работает очень медленно:
SELECT type, name
FROM sys.objects o
WHERE type IN('P','V','TR','FN','IF','TF')
  AND EXISTS
  (
   SELECT *
   FROM sys.objects oo
   WHERE o.type IN('P','V','TR','FN','IF','TF','U')
     AND DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CI_AI,oo.name,N''))
	  <> DATALENGTH(REPLACE(OBJECT_DEFINITION(o.object_id) COLLATE Cyrillic_General_CS_AI,oo.name,N''))
  );




Пример: есть вью

create view v1 as
select ID, Name from t1;


а таблица при этом:

create table t1
(
id int not null,
name nvarchar(1024)
)



такие вью хотелось бы найти
Так ещё и колонки надо отслеживать?
Колонки в sys.objects не записываются. Надо дорабатывать.
Поля я упустил...
12 май 17, 14:43    [20476631]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
iap
Так ещё и колонки надо отслеживать?
Колонки в sys.objects не записываются. Надо дорабатывать.
Поля я упустил...


Собственно, их, имена других объектов в текстах объектов и надо отслеживать, как в примере.
Т.е. в предположении, что таблицы созданы в ловеркейс и имена, и имена колонок, а во вью девелоперы могли накуролесить для красоты.
12 май 17, 14:49    [20476655]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Ролг Хупин
такие вью хотелось бы найти
Вью не получится простыми скриптами, потому что это надо анализировать семантику, то есть в каких таблицах искать колонки, если в вью несколько таблиц, и как выковыривать колонки из списка, если там сложные выражения.

PS Базу сорс-кодов используете? Можно посмотреть, какие разработчики настолько никакие, что не могут правильно скопировать имя.
12 май 17, 15:54    [20476948]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
человек_ниоткуда
Guest
ПКМ по серверу в SSMS>"Start powershell"
По всем базам искать в представах по шаблону '*_Fld4560_RRRef*'.
<#PS SQLSERVER:\SQL\{имя сервера}\DEFAULT#>
gci .\Databases\*\Views | % {$Name = $_.Name; $_.Script() -join "`r`n";} | ? {$_ -like '*_Fld4560_RRRef*'} | % {$Name}
12 май 17, 17:23    [20477197]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Ролг Хупин,

Объекты отследить можно:
+
use tempdb;
go

create table dbo.test_table (f1 int, f2 int);
go

create view dbo.v1
as
select F1, f2 from dbo.Test_table;
go

create procedure dbo.p1
as
begin
 select * from dbo.test_table;
end;
go

create procedure dbo.p2
as
begin
 select * from DBO.test_table;
end;
go

create procedure dbo.p3
as
begin
 select * from dbo.tEst_table;
end;
go

select
 objectpropertyex(m.object_id, 'BaseType'), a.name, b.name, c.name
from
 sys.sql_modules m join
 sys.sql_expression_dependencies ed on ed.referencing_id = m.object_id and ed.referencing_class_desc = 'OBJECT_OR_COLUMN' join
 sys.objects so on so.object_id = ed.referenced_id cross apply
 (select quotename(object_schema_name(m.object_id)) + N'.' + quotename(object_name(m.object_id))) a(name) cross apply
 (select quotename(object_schema_name(so.object_id)) + N'.' + quotename(so.name)) b(name) cross apply
 (select quotename(ed.referenced_schema_name) + N'.' + quotename(ed.referenced_entity_name)) c(name)
where
 ed.referenced_minor_id = 0 and
 b.name collate Cyrillic_General_BIN2 <> c.name collate Cyrillic_General_BIN2;
go

drop procedure dbo.p1, dbo.p2, dbo.p3;
drop view dbo.v1;
drop table dbo.test_table
go
Отследить столбцы таким же способом не получится.
12 май 17, 19:57    [20477596]     Ответить | Цитировать Сообщить модератору
 Re: Найти строки в текстах процедур, вью  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Ролг Хупин,

Если у тебя всё в нижнем регистре и ты "гарантируешь это", просто создай курсор по sys.sql_modules, LOWER(defenition) и пересоздавай объекты.
15 май 17, 11:59    [20481532]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить