Θέλω με κάποιο τρόπο να μην μου περνά τις default τιμές
σε αυτην την περιπτωση, προσδιορισε ολες τις στηλες "ρητά" οταν κανεις εισαγωγη, αν πχ. ο πινακας εχει 4 στηλες :
αντι :
INSERT INTO dbo.tbl(col1, col2, col3) VALUES(value1, value2, value3) --col4 isnt explicitly defined, default is used for col4
χρησιμοποιησε:
INSERT INTO dbo.tbl(col1, col2, col3, col4) VALUES(value1, value2, value3, NULL) --NULL is inserted in col4, not the default of col4
Για να "πιασεις" τις default τιμες, θα πρεπει να γνωριζεις τι εχει εισαγει ο χρηστης. Αυτο, δεν ειναι δυνατον λογω της σειρας με την οποια εκτελουνται οι ελεγχοι σε DML ενεργειες:
1. Defaults are applied as appropriate.
2. NOT NULL violations.
3. CHECK constraints.
4. FOREIGN KEY checks - referencing tables.
5. FOREIGN KEY checks - referenced tables.
6. UNIQUE and PRIMARY KEY constraints checks.
7. Triggers fire.
Οι triggers εκτελουνται μετα την εφαρμογη των default τιμων. Αρα, οταν οι στηλες δεν προσδιοριζονται ρητα (κατα την εισαγωγη τιμων), οι default τιμες εφαρμοζονται και οι triggers δεν μπορουν να γνωριζουν (και δεν τους ενδιαφερει) αν σε μια στηλη εχει εφαρμοστει η default ή η τιμη που εχει ορισει ο χρηστης.
Το να θελεις να μην εφαρμοζονται οι default τιμες για τις στηλες που δεν προσδιοριζονται ρητα αλλα παραλληλα να εχεις default τιμες ειναι αντιφατικο (μηπως δεν θα επρεπε να υπαρχουν default constraints εξ' αρχής?)
Ενημερωτικα, ενας τροπος για να δεις τι εχει προσδιορισει ο χρηστης ειναι να παρακαμψεις την εισαγωγη στον πινακα και να χρησιμοποιησεις view με instead of trigger :
USE tempdb
GO
IF OBJECT_ID('dbo.tbl') IS NOT NULL
BEGIN
DROP TABLE dbo.tbl
END
GO
CREATE TABLE dbo.tbl(pkid SMALLINT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
col1 varchar(20) NULL DEFAULT('col1 default'),
col2 SMALLINT NULL DEFAULT(0),
col3 DATETIME NULL DEFAULT(GETDATE()),
col4 INT NULL)
GO
CREATE TRIGGER dbo.tbl_trigger_ins_upd ON dbo.tbl
FOR INSERT, UPDATE
AS
BEGIN
--return if no rows were inserted or updated
IF @@ROWCOUNT = 0
BEGIN
RETURN
END
SET NOCOUNT ON
SELECT 'values inserted in the table' AS tbl_msg, *
FROM inserted
END
GO
IF OBJECT_ID('dbo.myview') IS NOT NULL
BEGIN
DROP VIEW dbo.myview
END
GO
CREATE VIEW dbo.myview
AS
SELECT pkid, col1, col2, col3, col4
FROM dbo.tbl
GO
--create instead of insert trigger on view
CREATE TRIGGER dbo.myview_trigger_insteadof_ins ON dbo.myview
INSTEAD OF INSERT
AS
BEGIN
--return if no rows were inserted
IF @@ROWCOUNT = 0
BEGIN
RETURN
END
SET NOCOUNT ON
SELECT 'values for insertion in the view, pkid is ignored' as view_msg, *
FROM inserted
--insert values into the table
INSERT INTO dbo.tbl(col1, col2, col3, col4) --pkid is ignored, {identity field}
SELECT col1, col2, col3, col4
FROM inserted
END
GO
--insert a value in the table
INSERT INTO dbo.tbl(col1) VALUES('tbl value')
--insert a value in the view
INSERT INTO dbo.myview(col1) VALUES('view value')
--get table records
SELECT * FROM dbo.tbl
--ΗΤΗ--