如何在postgresql中正确实现软删除?

时间:2017-01-19 22:10:22

标签: postgresql

在我的postgres 9.3数据库中,我有以下功能组合和触发器来实现软删除功能:

ALTER TABLE "LIBN02"."trigger_test_1"
ADD COLUMN delete_ind integer

CREATE OR REPLACE FUNCTION trigger_test_1_soft_delete()  
  RETURNS trigger AS $$
    DECLARE
      command text := ' SET delete_ind = 1 WHERE uuid_col = $1';
    BEGIN
      EXECUTE 'UPDATE ' || "LIBN02"."trigger_test_1" || command USING OLD.uuid_col;
      RETURN NULL;
    END;
  $$ LANGUAGE plpgsql;

CREATE TRIGGER test_1_soft_delete_trigger  
  BEFORE DELETE ON "LIBN02"."trigger_test_1"
  FOR EACH ROW EXECUTE PROCEDURE trigger_test_1_soft_delete();

完成上述所有操作后,我运行以下delete语句:

DELETE FROM "LIBN02"."trigger_test_1"

我收到以下错误:

ERROR:  missing FROM-clause entry for table "LIBN02"
LINE 1: SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
                            ^
QUERY:  SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
CONTEXT:  PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE

********** Error **********

ERROR: missing FROM-clause entry for table "LIBN02"
SQL state: 42P01
Context: PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE

为了让它起作用,我应该改变什么?

1 个答案:

答案 0 :(得分:1)

您收到的错误是因为<UserControl> <Grid Height="50" x:Name="myGrid"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Grid.Resources> <x:Double x:Key="NarrowMinWidth">0</x:Double> <x:Double x:Key="NormalMinWidth">521</x:Double> <x:Double x:Key="WideMinWidth">1200</x:Double> </Grid.Resources> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="AdaptiveVisualStateGroup"> <VisualState x:Name="VisualStateNarrow"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="{StaticResource NarrowMinWidth}" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="titleTxt.Width" Value="100"/> <Setter Target="artistTxt.Width" Value="100"/> </VisualState.Setters> </VisualState> <VisualState x:Name="VisualStateNormal"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="{StaticResource NormalMinWidth}" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="titleTxt.Width" Value="200"/> <Setter Target="artistTxt.Width" Value="100"/> </VisualState.Setters> </VisualState> <VisualState x:Name="VisualStateWide"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="{StaticResource WideMinWidth}" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="titleTxt.Width" Value="400"/> <Setter Target="artistTxt.Width" Value="200"/> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <TextBlock x:Name="titleTxt" Grid.Column="0" TextWrapping="NoWrap" TextTrimming="Clip" Text="{Binding Title}" VerticalAlignment="Center"/> <TextBlock x:Name="artistTxt" Grid.Column="1" Visibility="Visible" Margin="15,0,0,0" FontSize="13" Text="{Binding Artist}" VerticalAlignment="Center"/> <TextBlock x:Name="albumTxt" Grid.Column="2" Visibility="Visible" Margin="15,0,0,0" FontSize="13" Text="{Binding Album}" VerticalAlignment="Center"/> <TextBlock x:Name="yearTxt" Grid.Column="3" Visibility="Visible" Margin="15,0,0,0" FontSize="13" Text="{Binding Year}" VerticalAlignment="Center"/> <TextBlock x:Name="genreTxt" Grid.Column="4" Visibility="Visible" Margin="15,0,0,0" FontSize="13" Text="{Binding Genre}" VerticalAlignment="Center"/> <TextBlock x:Name="durationTxt" Grid.Column="5" Visibility="Visible" Margin="15,0,0,0" FontSize="13" Text="{Binding Duration}" VerticalAlignment="Center"/> </Grid> </UserControl> 是一个字符串(这些是用单引号引用的),而是一个标识符。你应该使用

"LIBN02"."trigger_test_1"

您还可以在EXECUTE 'UPDATE "' || TG_TABLE_SCHEMA || '"."' || TG_TABLE_NAME || '" ' || command USING OLD.uuid_col; 子句中添加AND NOT deleted,以避免不必要的流失。