Определение и изменение статического строкового фильтра

Применимо к: даSQL Server (все поддерживаемые версии) ДаУправляемый экземпляр SQL Azure

В этом разделе описывается определение и изменение статического строкового фильтра SQL Server при помощи среды SQL Server Management Studio или Transact-SQL.

В этом разделе

Перед началом

Ограничения

  • Если добавление, изменение или удаление статической строковой фильтрацией выполняется после инициализации подписок на публикацию, следует создать новый моментальный снимок и повторно инициализировать все подписки после внесения изменений. Дополнительные сведения о требованиях к изменениям свойств см. в статье Изменение свойств публикации и статьи.

  • Если публикация включена для одноранговой репликации транзакций, таблицы не могут быть отфильтрованы.

Рекомендации

Использование среды SQL Server Management Studio

Операции определения, изменения и удаления статических строковых фильтров выполняются на странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <Publication> . Дополнительные сведения об использовании мастера и доступе к этому диалоговому окну см. в статьях Создание публикации и Просмотр и изменение свойств публикации.

Определение статического фильтра строк

  1. Действия, выполняемые на странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <Publication> , зависят от типа публикации:

    • Для публикации моментальных снимков или публикации транзакций щелкните Добавить.

    • Для публикации слиянием щелкните Добавить, а затем щелкните Добавить фильтр.

  2. В окне Добавление фильтра выберите в раскрывающемся списке таблицу для фильтрации.

  3. Создайте инструкцию фильтра в текстовом поле Инструкция фильтра . Можно ввести текст в тестовом поле или перетащить столбцы из списка Столбцы .

    Примечание

    В предложении WHERE необходимо использовать имена, состоящие из двух частей; имена, состоящие из трех или четырех частей, не поддерживаются. Если публикация является публикацией от издателя Oracle, предложение WHERE должно соответствовать синтаксису Oracle.

    • Текстовая область Инструкция фильтра содержит текст по умолчанию, в виде:

      SELECT <published_columns> FROM [schema].[tablename] WHERE  
      
    • Текст по умолчанию изменять нельзя. Введите предложение фильтра после ключевого слова WHERE, используя стандартный синтаксис SQL. Законченное предложение фильтра должно выглядеть следующим образом:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE [LoginID] = 'adventure-works\ranjit0'  
      
    • В статическом фильтре строк может содержаться определяемая пользователем функция. Полное предложение фильтра для статического фильтра строк с определяемой пользователем функцией должно выглядеть следующим образом:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] WHERE MyFunction([Freight]) > 100  
      
  4. Нажмите кнопку ОК.

  5. Если вы находитесь в диалоговом окне Свойства публикации — <Publication> , нажмите кнопку OK, чтобы сохранить результаты и закрыть диалоговое окно.

Изменение статического фильтра строк

  1. На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <Publication> выберите фильтр в области Отфильтрованные таблицы, а затем нажмите кнопку Изменить.

  2. В окне Изменение фильтра измените фильтр.

  3. Нажмите кнопку ОК.

Удаление статического фильтра строк

  1. На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <Publication> выберите фильтр в области Отфильтрованные таблицы, а затем нажмите кнопку Удалить.

Использование Transact-SQL

При создании статей таблиц можно определить предложение WHERE для фильтрации строк из статьи. Также можно изменить фильтр строк уже после того, как он был определен. Статические фильтры строк можно создавать и изменять программно, с помощью хранимых процедур репликации.

Определение статического фильтра строк для публикации транзакций или публикации моментальных снимков

  1. Определите статью для фильтрации. Дополнительные сведения см. в статье определить статью.

  2. В издателе в базе данных публикации выполните процедуру sp_articlefilter (Transact-SQL). Укажите имя статьи в параметре @article, имя публикации в параметре @publication, имя фильтра в параметре @filter_name и предложение фильтрации в параметре @filter_clause (не включая WHERE).

  3. При необходимости определения фильтра столбцов см. раздел Определение или изменение фильтра столбцов. В противном случае выполнение процедуру sp_articleview (Transact-SQL). В параметре @publication укажите имя публикации, в параметре @article — имя фильтруемой статьи, а в параметре @filter_clause — условие фильтра, указанное в шаге 2. Будут созданы объекты синхронизации для отфильтрованной статьи.

Изменение статического фильтра строк для моментального снимка публикации транзакций

  1. В издателе в базе данных публикации выполните процедуру sp_articlefilter (Transact-SQL). Укажите имя статьи в параметре @article, имя публикации в параметре @publication, имя фильтра в параметре @filter_name и новое предложение фильтрации в параметре @filter_clause (не включая WHERE). Так как в результате этого изменения данные в существующей подписке станут недопустимыми, укажите значение 1 в параметре @force_reinit_subscription.

  2. В издателе в базе данных публикации выполните процедуру sp_articleview (Transact-SQL). В параметре @publication укажите имя публикации, в параметре @article — имя фильтруемой статьи, а в параметре @filter_clause — условие фильтра, указанное в шаге 1. В результате будет повторно создано представление, определяющее опубликованную статью.

  3. Чтобы сформировать обновленный моментальный снимок, перезапустите задание агента моментальных снимков для публикации. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot.

  4. Повторная инициализация подписок. Дополнительные сведения см. в статье Повторная инициализация подписок.

Удаление статического фильтра строк для моментального снимка публикации транзакций

  1. В издателе в базе данных публикации выполните процедуру sp_articlefilter (Transact-SQL). Укажите имя статьи в параметре @article, имя публикации в параметре @publication, значение NULL в параметре @filter_name и NULL в параметре @filter_clause. Так как в результате этого изменения данные в существующей подписке станут недопустимыми, укажите значение 1 в параметре @force_reinit_subscription.

  2. Чтобы сформировать обновленный моментальный снимок, перезапустите задание агента моментальных снимков для публикации. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot.

  3. Повторная инициализация подписок. Дополнительные сведения см. в статье Повторная инициализация подписок.

Определение статического фильтра строк для публикации слиянием

  1. В базе данных публикации на издателе выполните процедуру sp_addmergearticle (Transact-SQL). Укажите предложение фильтрации в параметре @subset_filterclause (не включая WHERE). Дополнительные сведения см. в статье определить статью.

  2. При необходимости определения фильтра столбцов см. раздел Определение или изменение фильтра столбцов.

Изменение статического фильтра строк для публикации слиянием

  1. В базе данных публикации на издателе выполните процедуру sp_changemergearticle (Transact-SQL). Укажите имя публикации в параметре @publication, имя фильтруемой статьи в параметре @article, значение свойства subset_filterclause в параметре @property и новое предложение фильтра в параметре @value (не включая WHERE). Так как в результате этого изменения данные в существующих подписках станут недопустимыми, укажите значение 1 в параметре @force_reinit_subscription.

  2. Чтобы сформировать обновленный моментальный снимок, перезапустите задание агента моментальных снимков для публикации. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot.

  3. Повторная инициализация подписок. Дополнительные сведения см. в статье Повторная инициализация подписок.

Примеры (Transact-SQL)

В этом примере репликации транзакций статья фильтруется горизонтально, чтобы удалить все неподдерживаемые продукты.

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @table, 
    @source_object = @table,
    @source_owner = @schemaowner, 
    @schema_option = 0x80030F3,
    @vertical_partition = N'true', 
    @type = N'logbased',
    @filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
    @publication = @publication, 
    @article = @table, 
    @filter_clause = @filterclause, 
    @filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table, 
    @column = N'DaysToManufacture', 
    @operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
    @publication = @publication, 
    @article = @table,
    @filter_clause = @filterclause;
GO

В этом примере репликации слиянием статьи фильтруются горизонтально, чтобы возвратить только строки, связанные с указанным менеджером по продажам. Также используется фильтр соединения. Дополнительные сведения см. в статье Определение и изменение фильтра соединения между статьями публикации слиянием.

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

См. также:

Определение и изменение параметризованного фильтра строк для статьи публикации слиянием
Изменение свойств публикации и статьи
Фильтрация опубликованных данных
Фильтрация опубликованных данных для репликации слиянием