一个关于SyBase 数据库 Insert 触发器的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个关于SyBase 数据库 Insert 触发器的问题相关的知识,希望对你有一定的参考价值。

我的表名叫“cjzyxk”,字段名是“xwsd”,在做Insert 时,我想做一个触发器,在Insert之前或之后触发,让插入的值不能大于80,如果大于80就插入80。谢谢。

-- create table cjzyxk
-- (
-- xwsd int
-- )
--
-- if exists(select * from sysobjects where name=\'tri_insert\')
-- drop trigger tri_insert
-- go
-- create trigger tri_insert on cjzyxk
-- after insert
-- as
-- declare @var int
-- select @var=xwsd from cjzyxk
-- if(@var>80)
-- begin
-- update cjzyxk set xwsd=@var
-- end
--
-- insert into cjzyxk values(89)
--
-- insert into cjzyxk values(5)
--
-- select * from cjzyxk
--
--
-- truncate table cjzyxk

我刚才试过好用!
参考技术A 你的表中少一个主键,没主键咋做啊
假设你的主键是sid
create trigger trigger_name
on cjzyxk
for insert
as
decalare @xwsd int
decalare @sid int
select @xwsd=xwsd ,@sid=sid from inserted
if(@xwsd>80)
update cjzyxk set xwsd=80 where sid=@sid

INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确

【中文标题】INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确【英文标题】:INSERT failed because the following SET options have incorrect setting only in Perl Sybase 【发布时间】:2014-06-04 05:14:37 【问题描述】:

我有以下 Perl 脚本:

use strict;
use warnings;
use DBI;

my $db_connect = 'dbi:Sybase:server=10.2.2.2\CATDB;charset=utf8;database=Dev';
my $db_username = "*****";
my $db_password = "*****";

my $dbh = DBI->connect($db_connect, $db_username, $db_password, RaiseError => 1, 
            PrintError => 1, 
            AutoCommit => 1,
            syb_chained_txn => 0, 
            syb_enable_utf8 => 1   ) || die "Failed to connect to BORIS database: $DBI::errstr\n";

my $insertContractSQL2 = '
BEGIN
DECLARE @ContractID int
UPDATE dbo.Sequences SET NextContractID = NextContractID + 1
SET @ContractID = (SELECT NextContractID FROM dbo.Sequences)

SET ANSI_NULL_DFLT_ON, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON
SET ANSI_NULL_DFLT_OFF, ARITHIGNORE, CURSOR_CLOSE_ON_COMMIT, IMPLICIT_TRANSACTIONS, NOCOUNT, NUMERIC_ROUNDABORT, XACT_ABORT OFF

INSERT INTO dbo.CONTRACTS 
            (ContractID
            ,modifieddate
            ,FranchiseID
            ,FamilyID
            ,EducatorID
            ,StartDate
            ,EndDate
            ,ContractTypeID
            ,PayRate1
            ,PayRate2
            ,PayRate3
            ,PayRate1Hours
            ,PayRate2Hours
            ,PayRate3Hours
            ,WageAdminContractorRate
            ,PorseContributionContractorRate
            ,WageAdminAmount
            ,ACCAmount
            ,PorseContributionAmount
            ,WINZSubsidyAmount
            ,WINZSubsidyAmountChildcareOSCAR
            ,ACCInvoicedPerQuarterAmount
            ,FamilyAPAmount
            ,OtherFortnightPayment
            ,OtherFortnightPaymentDesc
            ,ReferralAgencyID
            ,NextAppraisalDate
            ,NextAppraisalTypeID
            ,PendingApproval
            ,Active
            ,modifiedby
            ,BeingEdited
            ,MOENetworkID
            ,NewFlag
            ,ReceivedDate
            ,FreeECEAmount
            ,OptionalChargeRate
            ,OptionalChargeAgreement
            ,TerminationApproved
            ,AgreedDeductions
            ,PayRateEce
            ,PayRateEceHours
            ,PreECEClarity
            ,TotalOptionalCharges
            ,NonChildPorseContributionAmount
            ,FreeECETopup
            ,Donation
            ,NonChildWinzChildcareAmount
            ,ManuallyTerminated
            ,ContractDuplicatedFlag
            ,CreateDate
            ,RosteredContractID)
            VALUES (
             @ContractID
            ,GETDATE()
            ,63,22901,9134,\'2014-06-03 00:00:00.0\',\'2014-06-28 00:00:00.0\',2,0,0,0,5,0,0,4.75,0,0,0,0,0,0,0,0,0,null,null,null,null,0,1,\'admin\',1,null,0,\'2014-06-10 00:00:00.0\',0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,\'2014-06-03 15:30:15.037\',4)

END  
';

 $dbh->do($insertContractSQL2);

当它运行时,我得到:

/usr/bin/perl test.pl
DBD::Sybase::db do failed: Server message number=1934 severity=16 state=1 
    line=10 server=BOBSTER\BOBSTER1 text=INSERT failed because the
    following SET options have incorrect settings: 'ANSI_NULLS, 
    CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING'. Verify that 
    SET options are correct for use with indexed views and/or indexes on 
    computed columns and/or filtered indexes and/or query notifications 
    and/or XML data type methods and/or spatial index operations.  
    at test.pl line 89.

现在我知道这是一个糟糕的问题。但是我已经通过 SQL Server 的三个不同 GUI 运行了相同的查询,但没有收到此错误。我浏览了谷歌搜索结果的前 3 或 4 页,但一无所获。任何信息将不胜感激。

注意:我假设因为查询在其他设置选项的工具中运行是正确的

【问题讨论】:

如果您使用SQL Server,请查看我在Failed because incorrect arithabort setting 页面上的回答。希望这会有所帮助... 【参考方案1】:

请参考this link,您可能需要设置顺序来创建具有持久计算列的表,必须启用以下连接设置:

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT ON
SET QUOTED_IDENTIFIER ON

您可以使用 $sth->do() 方法或使用 ISQL 来设置它。在连接到数据库后,您需要先执行它们,然后再执行“SELECT”、“UPDATE”或任何其他命令。

【讨论】:

谢谢,是的,它应该是这样工作的。然而这并没有帮助。 如果你直接在 db 上执行 insertContractSQL2 语句,你会得到任何错误吗? 不,我没有收到任何错误。这个缺失的部分是该集合必须是首先执行的。把这个第一个 $boris_dbh->do(' SET ANSI_NULL_DFLT_ON, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON SET ANSI_NULL_DFLT_OFF, ARITHIGNORE, CURSOR_CLOSE_ON_COMMIT, IMPLICIT_TRANSACTIONS, NOCOUNT_ROUND_BORT_BORT修好了。 啊,我明白了。是的,SET 应该是连接 DB 后的第一件事。 现在我有一个简单的例子。但是当我尝试在真实代码中做同样的事情时,它会中断。这不是我的日子...【参考方案2】:

我用这种讨厌的方式解决了它:

EXEC('
    IF EXISTS(SELECT * FROM sysindexes WHERE Name = ''IX_GPS_XY'') 
        DROP INDEX [IX_GPS_XY] ON [dbo].[Cities];
')
EXEC('
    INSERT INTO dbo.Cities(Name, CountyID, GPSXY) 
    VALUES...
')
EXEC('
    IF NOT EXISTS(SELECT * FROM sysindexes WHERE Name = ''IX_GPS_XY'') BEGIN
        SET ARITHABORT ON;
        ...
        CREATE SPATIAL INDEX...
')

【讨论】:

【参考方案3】:

我运行了一个由 SQL Server studio 生成的脚本,但出现错误“插入失败,因为以下 SET 选项的设置不正确:'ANSI_PADDING'”

我的解决方案是添加关键字“GO”并且脚本有效。

有错误的脚本:

--SOME INSERT STATEMENTS
SET ANSI_PADDING ON

--SOME INSERT STATEMENTS

有效的脚本:

--SOME INSERT STATEMENTS
SET ANSI_PADDING ON
GO
--SOME INSERT STATEMENTS

希望对你有帮助。

【讨论】:

以上是关于一个关于SyBase 数据库 Insert 触发器的问题的主要内容,如果未能解决你的问题,请参考以下文章

sybase iq数据库 insert into select 数据量大时报错

如何识别与 sybase 数据库中的表关联的触发器?

INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确

Sybase ASE 15.7 中的审计表触发器

sybase中如何查询前一天的数据

关于sql触发器调试问题