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

Применимо к:SQL Server Управляемый экземпляр SQL Azure

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

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

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

Ограничения

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

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

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

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

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

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

  1. На странице "Строки таблицы фильтра" мастера создания публикации или страницы "Фильтры строк" диалогового окна "Свойства публикации " Публикация> " <Публикация" действие зависит от типа публикации:

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

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

  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. Если вы находитесь в диалоговом окне "Свойства публикации — <публикация> ", нажмите кнопку "ОК ", чтобы сохранить и закрыть диалоговое окно.

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

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

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

  3. Нажмите ОК.

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

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

Использование 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). Поскольку это изменение приведет к недействительности данных в существующей подписке, в параметре @force_reinit_subscription необходимо указать значение 1.

  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. Поскольку это изменение приведет к недействительности данных в существующей подписке, в параметре @force_reinit_subscription необходимо указать значение 1.

  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

См. также

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