Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

default values

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος spaceman στις 16-03-2011, 15:27. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-03-2011, 11:44 64211

    default values

    Έχω έναν trigger Onafter insert / update   και έχω στο inserted table default τιμές γιατί έχω default τιμές στον πίνακα. Θέλω με κάποιο τρόπο να μην μου περνά τις default τιμές .Πως μπορώ να τις πιάσω ?
    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  16-03-2011, 15:27 64252 σε απάντηση της 64211

    Απ: default values

    Θέλω με κάποιο τρόπο να μην μου περνά τις 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

    --ΗΤΗ--

     

     

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems