當前位置:首頁 » 編程語言 » sql觸發器修改失敗
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql觸發器修改失敗

發布時間: 2023-05-27 13:14:20

『壹』 在sql中如何用代碼創建觸發器,要求修改時提示不能修改

use cjgl
go
create trigger trt
on student
for update
as
if update (某個列)
print '不能修改'
go
--不能整張表歷察判斷 ,並且你的語逗廳句沒有回滾
--如果希望整張表禁止修改,推薦使用肢指茄instead of 觸發器代碼如下:
use cjgl
go
create trigger trt
on student
instead of update
as
print '不能修改'
go

『貳』 SQL中用觸發器控制某一列不能修改

你的觸發器 是什麼條件··是哪個表做了什麼動作 觸發 什麼?

『叄』 求大神啊~~~~SQL2005觸發器錯誤修改

你用的oracle的銷閉晌寫法來寫態攜sqlserver當然報錯虧鋒

createtriggertr_defaultion1
ondefaultionforupdate
as
begin
ifupdate(cancel)
begin
ifcancel%3=0
begin
updatedefaultionsetdefaults=defaults+1
end
end
end

『肆』 sql 執行觸發器 執行語句不成功

你這個是FOR觸春雀發器,在語句後面執行,inserted和ssss表中的數據已經是一樣的了,你下面兩句得到的結果都是修改後的值:


select@sname=name,@ssr=srfrominserted

select@ssr2=srfromsssswherename=@sname


改成:

createtriggercf_lzonssss
forinsert,update
as
declare@snamenvarchar(10),@ssrnvarchar(10),@ssr2nvarchar(10)
select@sname=name,@ssr=sr李緩fromdeleted
select@ssr2=srfromsssswherename=@sname
printlen(@ssr)
print@ssr
if(len(@ssr2)>0andlen(@ssr)>0)
begin
print哪森模1
rollbacktran--rollbacktran
end

『伍』 SQL語句建立觸發器中語句出錯了,哪位幫我修改阿謝謝

樓主的語法是按orcale來的吧?sql server2000中的trigger中沒有before、for each row、new等關鍵字。下面我寫了個,能實現你的功能,只是不知道有沒有性能更好的寫法。期待更佳的....

if exists(select * from sysobjects where name='Insert_Or_Update_sal')
drop trigger Insert_Or_Update_sal
go
CREATE TRIGGER Insert_Or_Update_sal
ON TEACHER
FOR insert,update
AS
BEGIN
declare @job char(8),@sal numeric(7,2),@eno numeric(4)
--inserted是insert或update觸發表臨時表,參考下面幫助。
select @eno=eno,@job=job,@sal=sal from inserted
if @job='教授' and @sal<4000
update teacher set sal=4000 where eno=@eno

--下面的兩句也可能完成這個功能,只是性能低一些。
-- if exists(select * from inserted where job='教授' and sal< 4000)
-- update TEACHER set sal=4000 where job='教授' AND sal<4000
END

下面是sql server2000幫助文檔中相關trigger的部分,希望對你有幫助。
----------------------------------------------------------------
CREATE TRIGGER
創建觸發器,觸發器是一種特殊的存儲過程,在用戶試圖對指定的表執行指定的數據修改語句時自動執行。Microsoft® SQL Server™ 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創建多個觸發器。

語法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}

參數
trigger_name

是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。

Table | view

是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。

WITH ENCRYPTION

加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。

AFTER

指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。

如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。

不能在視圖上定義 AFTER 觸發器。

INSTEAD OF

指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。

在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。

INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。

對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。

WITH APPEND

指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。

WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。

NOT FOR REPLICATION

表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。

AS

是觸發器要執行的操作。

sql_statement

是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。

當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。

觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:

deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted

如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。

n

是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。

IF UPDATE (column)

測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。

說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。

可以在觸發器主體中的任意位置使用 UPDATE (column)。

column

是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。

IF (COLUMNS_UPDATED())

測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。

COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。

可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。

bitwise_operator

是用於比較運算的位運算符。

updated_bitmask

是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。

comparison_operator

是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。

注釋
觸發器常常用於強制業務規則和數據完整性。SQL Server 通過表創建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。

可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。

如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設置的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。

只有當觸發 SQL 語句(包括所有與更新或刪除的對象關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的運行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。

觸發器限制
CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。

觸發器只能在當前的資料庫中創建,不過觸發器可以引用當前資料庫的外部對象。

如果指定觸發器所有者名稱以限定觸發器,請以相同的方式限定表名。

在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發器操作。

如果一個表的外鍵在 DELETE/UPDATE 操作上定義了級聯,則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發器。

在觸發器內可以指定任意的 SET 語句。所選擇的 SET 選項在觸發器執行期間有效,並在觸發器執行完後恢復到以前的設置。

與使用存儲過程一樣,當觸發器激發時,將向調用應用程序返回結果。若要避免由於觸發器激發而向應用程序返回結果,請不要包含返回結果的 SELECT 語句,也不要包含在觸發器中進行變數賦值的語句。包含向用戶返回結果的 SELECT 語句或進行變數賦值的語句的觸發器需要特殊處理;這些返回的結果必須寫入允許修改觸發器表的每個應用程序中。如果必須在觸發器中進行變數賦值,則應該在觸發器的開頭使用 SET NOCOUNT 語句以避免返回任何結果集。

DELETE 觸發器不能捕獲 TRUNCATE TABLE 語句。盡管 TRUNCATE TABLE 語句實際上是沒有 WHERE 子句的 DELETE(它刪除所有行),但它是無日誌記錄的,因而不能執行觸發器。因為 TRUNCATE TABLE 語句的許可權默認授予表所有者且不可轉讓,所以只有表所有者才需要考慮無意中用 TRUNCATE TABLE 語句規避 DELETE 觸發器的問題。

無論有日誌記錄還是無日誌記錄,WRITETEXT 語句都不激活觸發器。

『陸』 oracle中,用pl/sql創建觸發器報觸發器無效且未通過重新驗證

一般情況就是觸發器的語法不正確。

觸發器的桐睜一般語法如下:

CREATE[ORREPLACE]TRIGGER局岩歲trigger_name
{BEFORE|棗陪AFTER}
{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}
[OR{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}...]
ON[schema.]table_name|[schema.]view_name
[REFERENCING{OLD[AS]old|NEW[AS]new|PARENTasparent}]
[FOREACHROW]
[WHENcondition]
PL/SQL_BLOCK|CALLprocere_name;

『柒』 SQL觸發器無效

「我想在一個表發生變時另外一個表跟著碰困出現同樣的變化」
既然你想實現這信轎個功能,那麼在觸發器里你應該像另外一個表插入數據才對。
而你的觸發器是更新操作,如果ky_totaldata表沒有數笑坦念據的話,肯定不會有什麼變化。

假如兩個表結構相同,那麼用如下觸發器

create trigger [TRI_NEWSDATA]
ON [dbo].[KY_NEWSDATA]
for insert
as

insert into [dbo].[ky_totaldata]
select *
from inserted

向KY_NEWSDATA表插入數據後,就會觸發進ky_totaldata表中。

『捌』 sql server2005觸發器修改問題

'CREATE TRIGGER' 必須是查詢批次中的第一個語句。
所以trigger 不能在咐寬begin 與 end中。你可衡逗亮以先刪除然後再創建。

if object_id('timeTable') is not null
drop table timeTable
go
--創建表
create table timeTable
(
id int,
date_time datetime,
updatetime datetime,
)
go
--刪除觸發器
if object_id('setTime') is not null
drop trigger setTime
go
--創建觸發器
create trigger setTime
on timeTable
for insert,update
as
begin
print 'aaaa'
end
go
--插入數據
insert into timetable values(1,'01-07-01 12:00:00','01-07-01 13:00:00')
select * from timeTable
--修改指念觸發器
drop trigger setTime
go
--創建觸發器
create trigger setTime
on timeTable
for insert,update
as
begin
print 'ffff'
select * from timeTable
end

『玖』 sql觸發器不起作用

觸纖乎埋發器能應該正常被觸發. 問題在於你的條件if @amount = null, 這個頃物表達式的結果永遠都是false, 故毀螞你的update語句不會被執行. 要改成if @amount is null.

『拾』 SQL2000 創建修改觸發器是出現這樣的錯誤,不知要怎樣修改,求高手指點

呵呵
樓主剛開始接觸觸滾顫扒發器吧
沒有updated這個表
在sql中洞余
更新的機制大昌是先刪除
再插入
幫你寫個條件吧
其他的你應該能搞定
不明白可以隨時問我
希望解決了樓主的問題
if
exists(select
1
from
inserted
where
weight
>1000)
and
exists(select
1
from
deleted
)